今天早上在正式服部署了新代码,过了一段时间,服务器的负载告警,cpu使用率告警,登录服务器查询,发现是mysql导致cpu的使用率过高,于是show processlist查询了一下,看到有很多线程处于sending data和lock的状态中,都是select某个数据库的某张表的操作。

  于是将sending data的那些sql语句复制执行了一遍,发现执行它们的时间太长,然后又explain分析了一下。

  有条select的条件中没有主键和索引,由于查询条件中那个字段具有唯一性,所以和开发商量将这个字段加入索引,果然根据这个字段select的sql都不会处于sending data的状态了;

  有条select的条件中是有根据主键查询的,但是也是处于sending data状态,不过这张表用的是复合主键,但是复合主键中有索引的只是第一个字段,第二个字段是无索引的,所以查询速度慢了很多。

  根据主键第一字段和第二字段测试查询的结果如下:

wKioL1XUtIezrmHRAACDgefRG2U000.jpg

wKiom1XUsnqQboygAACDZ4qPLB8515.jpg

所以需要另外为第二字段增加一个索引。

  关于复合主键的索引问题可以参考下面这篇文章

  http://www.oschina.net/question/12_38140

  增加索引后,cpu的使用率下降了许多,但是还是存在问题的。所以我们先回退了版本,在测试服再做下并发测试,将问题完全解决再部署到正式服。在测试服开启慢查询日志,将所有执行效率低的sql优化下。

  慢查询日志开启的文章

  http://www.cnblogs.com/echo-something/archive/2012/07/25/2607771.html

  mysql5.1以上版本才支持方法2,动态开启或关闭日志功能。