星期日, 11月 2nd, 2008 323 次访问
昨天有个朋友谈起复合索引,之前对复合索引只是大概了解没有专门的总结也不敢多言复合索引使用方法的优劣.查阅相关资料后把例子贴出与大家分享,希望可以抛砖引玉.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。下面用几个例子对比查询条件的不同对性能影响.
create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);
优: select * from test where a=10 and b>50
差: select * from test where a50
优: select * from test where order by a
差: select * from ...
Posted in mysql, 技术 | 11 Comments »
星期六, 11月 1st, 2008 244 次访问
注:本文只谈系统的可扩展点,并不涉及相关技术的具体实现。可扩展性的定义特性: 1.系统可以容纳使用率的增加,可以简单的理解为用户数的增加2.系统可以容纳数据集的增加。3.系统可维护。误区:1.可扩展不是指原始速度,性能和可扩性是不同的问题2.可扩展性与是否选择某种语言无关。3.可扩展性与特定的技术是无关的。扩展的几个方向与要点:一,扩展硬件平台硬件扩展大体上可以分为两类:1.垂直扩展:原理:很简单当机器性能不足时买一台更大,更强,更猛的机器代替。优点:设计容易实现,只需在本地机器上构建系统。一定体系稳定,只要换好的机器就行。不足: 成本不是线性增加的,可能是指数级的。尽管你很有钱,不担心钱的问题,不过由于单台机器的能力有限的,那么这种模型最终会受到限制。2.水平扩展:原理:不断的增加更多的硬件,不同垂直扩展的是增长不需要超级强劲的机器,只要很多常规机器。优点:能够混用不同服务器并且能够配备最便宜服务器的应用程序,将一直保持成本上的优势。不足:添加减少机器可能比较容易,但不会过于简单.你将要花费大量的管理成本。3.冗余:不管是垂直扩展还是水平扩展,机器都有可能发生故障,这样的话给机器做完全热备是必要的,当一个组件故障时,其他组件自动接手它的工作。二,负载平衡1. DNS负载平衡这个最简单的平衡方案,同时存在不少的问题.1)做法:在 DNS中给一个域添加多个IP,这样请求域名解析的时候分随机的返回不同的IP地址实现平衡的目的2)问题: 更新dns的速度比较缓慢,如果要移除一台坏的机器比较的困难了,另一个问题就是无法实现精确控制,也不能定制化平衡。总得来说DNS负载不是一个好的方案。2.VIP:这个名词比较有意思,记得有一回去yahoo,技术人员与我谈代码发布时谈到了VIP的一个问题,我就有点乱了,VIP===》贵宾?。还冒出了MVP之类的概念.:VIP是虚拟IP的意思,一个VIP是由负载平衡器提供的一个IP地址,背后其实有多个实际的IP地址在处理请求.负载平衡器也被称作虚拟服务器。3.硬件方式的负载平衡:1)别名:web交换机,内容交换机,内容路由器.2)特点:非常的昂贵。4.软件方式的负载平衡:1)前一段时间才知道lvs(http://www.linuxvirtualserver.org)是一个给linux打上内核补丁的负载平衡操作系统,不过lvs是为了处理极为复杂的负载情况,对于一般平衡就没有必要。2)第四层与第7层负载平衡注意这个第字。刚接触的时候不理解,直接看成四层,与7层。呵呵,7层比4层多三层当然7层要牛很多。第7层的确比第4层更灵活,但原因绝对不是7比4大.第4层与第7层指的是网络分层.
Posted in linux, php, 技巧, 技术 | No Comments »
星期日, 10月 26th, 2008 307 次访问
所谓找出瓶颈,就是找出程序中费时最多的部分。要查看各个时间段,从请求进入到我们网络的边界开始,直到响应离开。 Donald Knuth: 在条件不成熟的情况下贸然进行优化是程序设计中所有罪恶的源泉。如果只是想着要重构X,就能加快这儿的速度,而不去实际测试系统并确认X处于关键路径中,那就是在浪费时间和精力。关于CPU: 在不成熟的观察者看来,cpu时间是每个应用程序的主要瓶颈,而实际上,这种情况很少发生,影响程序的主要性能的真正原因是 IO.什么是IO?IO包括了所有的数据移动,数据移动的本质上就是应用程序中所做的一切。和大家的观点相反,cpu处理速度基本上从来不是web应用程序中的瓶颈。如果发现主要瓶颈在cpu,那很有可能在基本设计层面存在问题.(那些少数cpu密集任务除外,如处理图像,视频,音频,加密大段数据等) top命令的%CPU列显示每个进程占用cpu的情况,也可以用uptime看一下当前系统的平均负载。代码性能测试: 捕捉运行中代码的运行信息用,识别代码中最费时的部分有利于代码的优化。比较简单直接的做法不是在函数运行之前记下当前时间戳,到了函数运行之后再记一下时间,两个时间相差就可以算出当前函数花费时间。对于php程序员来说用xdebug(http://xdebug.org)是一个好的选择,安装了xdebug之后在脚本运行之前调用xdebug_start_profiling(),在脚本调用结束后运行xdebug_dump_function_trace()就可以以html来输出性能测试数据的表格。大家可以一试,很不错。测试代码会大大降低执行速度,如果有一个负载均衡池,可以让一部份的生产流量流经剖析工具。提高代码运行的速度: 1.操作码缓存: 在cgi模式下,每执行一次脚本都要编译源代码。可以借助一些工具把源码编码成OPCODE做存起来多次运行,APC缓存是一个好的方案 2.提高模板反应速度: 与opcode相同的原理,多次编译是浪费时间,模板可以保存编译结果多次调用。在调用时默认会查看源模板文件,如果有更新就重新编译。在很多时候可以关闭检查模板是否更新的开关,减少文件IO.提高反应速度:$smarty->compile_check=0.关于I/O 1.磁盘IO:可以通过系统的一些工具更好的了解磁盘的IO情况,可以用iostat查看当前的系统的磁盘IO值.这装命令:sudo apt-get install sysstat
Posted in 技巧, 技术 | 4 Comments »
星期二, 10月 21st, 2008 257 次访问
数据完整性的原则:应用程序内部的数据是有用的,换句话说就是引入的数据在边界处被过滤,以过滤后的结果存储,在输出数据的时不再需要做任何处理。在过滤数据时要分清好的,有效的,无效的数据的处理。基于以上原则在做web程序设计是要注意以下几点:1.过滤不支持的编码格式 如果你的整个体系里面用的是utf-8编码,那么你就在数据输入的时候过滤或者转化掉其他编码的字符. 相关php方法: utf8_encode($input), iconv("utf-8","utf-8",$str);注后者要装iconv扩展2.过滤控制字符 很多时候输入中含有控制字符,这此控制字符虽然是有效的数据,但不是良好的数据。这时候最好把控制字符给过滤掉,可以简单的把小于0x20的 ascii字符过滤之。 相关方法: 1. preg_replace('!\p{C}!u','',$data)//清除所有控制字符 2.preg_replace('!\r\n?','\n',$input) //统一所有平台的回车,还省空间3.过滤html html的过滤比较头痛,可以用strip_tags()进行过滤,所有的html标签,但是想有选择的过滤html就比较惨了。这时个可以要你写比较复杂的正则表达式。 注:把所有的外部来源的数据当成是感染过的数据是重要的,只有你自己消除感染的数据才是安全的。 有时间 可以看一下lib_filter(http://code.iamcal.com/php/lib_filter) 4.防止sql注入攻击:
Posted in mysql, php, 技巧, 技术 | 3 Comments »
星期六, 10月 11th, 2008 391 次访问
常在河边走,哪有不湿鞋。当服务器运行时间为无限时,挂机也将会成为常态。所以宕机后的灾后处理也成为运维人员的必修课。为了纪念此次宕机事件,以切身的经验与来分享如何简单的做数据库恢复。 众所周知,机器因故断电重启对web server的影响是很少的,但是对data server的危害却巨大的。这些倒来个彻底,由于机房原因所有的服务器全部重启了。不出所料,所有的服务重新开启后网站正常工作,很高兴数据库还能跑起来,看来伤害还不是特别大,不过还是很小心确认一下数据库的运转情况,首先进入一台mysql,从服务器1.show processlist 查看了一下当前运行进程功能: 显示mysql当前运行的进程.目的: 因为数据库做了主从,所以我想看看主从的工作正常与否.扩展: show full processlist显示完整的当前运行进程.数据显示:*************************** 2. row *************************** Id: 919176 User: system user Host: db: NULLCommand: Connect Time: 25507 State: Waiting for master to send event Info: NULL*************************** 3. row ***************************好家伙,time怎么达到2W多秒呢。可能从服务器备份出问题了,先看状态再说:注:time显示主从机器的备份时间差2. show slave status 功能:查看当前从服务器的运行情况:目的:查看slave是否没有开同步进程。扩展: 还有show master status:使用对像是master服务器显示数据片断:*************************** 1. row *************************** Slave_IO_State: Waiting ...
Posted in linux, mysql, 技术 | 2 Comments »
星期日, 9月 7th, 2008 340 次访问
1.mysql库中的几个表的简介: user: 决定是否允许或拒绝到来的连接,对于允许的连接,user表授予的权限指出用户的全局权限。这些权限适用于服务器上的all数据库。 db: 决定用户能从哪个主机存取哪个数据库,权限列决定允许哪个操作,授予的数据库级别的权限适用于数据库和它的表。 当你想要一个给定的db表行应用于若干主机时,db和host表一起使用. tables_priv和columus_priv表类似于db表,但是更精致它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和所有它的列,授予列级别的权限只适用于专用列. procs_priv表适用于保存的程序。授予程序级别的权限只适用于单个程序。2.当mysqld服务器启动时,将授权表的内容读入到内存中,你可以通过flush privileges语句或执行mysqladmin flush-privileges或mysqladmin reload命令让它重新读取表.3.一些mysql权限系统做不到的。 1.你不能明显地指定给定的用户应该被拒绝访问,即,你不能明显地匹配用户然后拒绝连接。 2.你不能指定用户有权建立或删除数据库中的表,但不能创建或删除数据本身。
Posted in linux, mysql, 技术 | 2 Comments »