Archive for » June 5th, 2008 «

MySQL数据库运用技巧和优化(不断更新)

一个LAMP架构的网站,经常说这慢那慢的,其实从架构到代码到数据库,优化的空间是非常非常多的(架构设计参照我另外一篇文章),就看你是否愿意花心思去一点一点儿的做起,比如mysql,在lamp网站的架构优化中,往往是很多人最容易忽略的环节,却往往成为优化空间最大的环节,一句不经意的sql语句,可能就会导致数据库执行时间过长,进而导致锁表时间过长,最后导致整站垮掉,让另外99%的努力工作和优化都失去意义,所以,Mysql的优化,需要细致而有耐心的进行,一点一点儿的挖,从slow_query日志开始,从my.cnf参数配置开始,从sql语句写法开始,从表中的索引index开始。。。

即日起,不断整理和MySQL的运用技巧与优化的内容,下面先想到一些是一些。

【索引】

  1. 一般来说,如果选择性超过 20% 那么全表扫描比使用索引性能更优,Oracle在选择性超过25%时会选择全表扫描。
  2. 组合索引比单一索引更有效,但是需要合理使用,清楚你在干什么,组合索引采用B树类型,左前缀的特性,创建组合索引的时候,要考虑到具体的使用场景和逻辑。
  3. 在需要创建索引的字段上,不能设置默认值为NULL,或者也不能插入NULL值,否则索引没有意义。(好像5.1后部分类型的表可以支持NULL的索引)
  4. 不是索引越多越好,过多索引容易导致更新和插入数据效率大大降低。
  5. 要理解最基本的索引概念,只有在where和join用到的字段上创建索引才有价值,另外Max()和Min()函数用到的字段也需要
  6. Where条件里面,有些情况下也是用不到索引的,比如<>, NOT IN, LIKE语句以 %_开头的时候,这时,可以用 id>m or id,用 NOT EXISTS代替NOT IN,可以用到索引的WHERE条件有:<,<=,=,>,>=,BETWEEN,IN,不以%_开头的LIKE。
  7. 对于CHAR和VARCHAR字段,只用字段的一部分就可创建索引。创建索引时,使用col_name(length)语法,因为多数字段的前10个字符通常不同,所以此索引不会比使用字段的全名创建的索引速度慢很多。另外,使用字段的一部分创建索引可以使索引文件大大减小,从而节省了大量的磁盘空间,有可能提高INSERT操作的速度。尤其一些md5()后结果的字段比较适用。

【SQL】

  1. 经常用EXPLAIN来检查你的SQL查询语句,找出那些想当然却事与愿违的隐藏问题。
  2. 常常检查slow query的日志,针对性的深挖慢嚼,改善你的系统性能

【架构和配置】

  1. 主辅库同步,通过搭建Master-slave的架构,可以把系统的读写分离,一方面提高了系统因为数据库单点导致的锁表代理的性能瓶颈,还能使系统的架构更加灵活,可以在某一台slave机器上进行数据统计分析,也可以在某一个slave上进行定时的cron任务或者daemon程序操作,从大型网站使用mysql来说,replication是必须的架构。
  2. memory 类型表

【新特性】

  1. 适当的使用触发器,对于web应用来说,可以在很多地方降低代码的复杂度,提高业务逻辑的可靠性,从我的经验来看,可以在大型应用中适当的使用触发器,比如删除一条评论,用户user表里面的评论数字段自动减1这样的操作就可以通过触发器来完成。

【附录】
more »

Category: MySQL / DB  15 Comments