今天早上在正式服部署了新代码,过了一段时间,服务器的负载告警,cpu使用率告警,登录服务器查询,发现是mysql导致cpu的使用率过高,于是show processlist查询了一下,看到有很多线程处于sending data和lock的状态中,都是select某个数据库的某张表的操作。
于是将sending data的那些sql语句复制执行了一遍,发现执行它们的时间太长,然后又explain分析了一下。
有条select的条件中没有主键和索引,由于查询条件中那个字段具有唯一性,所以和开发商量将这个字段加入索引,果然根据这个字段select的sql都不会处于sending data的状态了;
有条select的条件中是有根据主键查询的,但是也是处于sending data状态,不过这张表用的是复合主键,但是复合主键中有索引的只是第一个字段,第二个字段是无索引的,所以查询速度慢了很多。
根据主键第一字段和第二字段测试查询的结果如下:
所以需要另外为第二字段增加一个索引。
关于复合主键的索引问题可以参考下面这篇文章
http://www.oschina.net/question/12_38140
增加索引后,cpu的使用率下降了许多,但是还是存在问题的。所以我们先回退了版本,在测试服再做下并发测试,将问题完全解决再部署到正式服。在测试服开启慢查询日志,将所有执行效率低的sql优化下。
慢查询日志开启的文章
http://www.cnblogs.com/echo-something/archive/2012/07/25/2607771.html
mysql5.1以上版本才支持方法2,动态开启或关闭日志功能。
原文地址:http://bzlbc.blog.51cto.com/8590656/1686256