mysql添加索引后导致cpu飙升问题记录
背景
新加的功能某个数据接口查询慢,经排查是查询一个第三方绑定数据表慢,所以向数据库添加索引以提高查询速度,但是在添加后服务器CPU直接从20+%直接飙升至95+%,数据库连接数也飞涨,结果当然就不用说了,直接导致日志入库失败,数据查询超时,影响现有业务。
问题排查
首先考虑做了什么操作导致的问题,因为问题出现是在添加索引后出现的,所以首先考虑的是添加的索引有问题,由于同时添加了几个索引,不知道是哪个出了问题。
我们尝试删除所有新加的索引,但是服务器CPU拉满了,任何操作都做不了,这就很蛋疼。
我们的数据库使用的是AWS的RDS,它提供了performace insight的功能,可以查看Top 10耗时的操作,我们看到新添加索引的表查询非常慢,大量sql语句等待执行。
现在想让mysql能够执行我们的删除索引的命令,所以我们尝试临时升级mysql的配置,但是没有什么用,升级后CPU也是直接95+%,还是无法执行删除索引操作。
最后无奈,只能将慢查询所在的业务接口暂时停掉(注:我们这里的服务器主要是日志记录,所以综合考量暂时停一下影响不大), 等CPU降下来后,执行索引删除操作,恢复出问题之前的状态。
索引的问题
回过头来再看索引的问题,添加的几个索引中,有一个索引其实是有问题的,问题索引的数据值分布很少,这样的索引过滤行很差,这样的索引就很容易引起CPU飙升。
具体的分析可参考:http://mysql.taobao.org/monthly/2015/10/03 ,这里不做详细阐述。
总结
1.合理的使用索引
2.对生产环境的操作一定要经过压测,这里我们就只是在测试环境添加后没有出现问题就直接上生产环境,这个流程就出现了问题。