mysql 查询慢,cpu占用高,state sending data 问题解决

  • 2022-10-02
  • 浏览 (2385)

随着seaxiang.com的数据和访问量越来越多,获取数据越来越慢,有时cpu竟然100%了。

使用iotop发现mysql的disk read很高,几十M每秒。

使用mysql的show processlist有好几个state的状态是sending data

为什么会频繁出现 sending data

Sending data状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

这里的关键是为什么要收集数据,原因在于:如果没有走mysql的“索引”,mysql需要到“数据行”上将需要返回的数据读取出来返回个客户端。

没有索引的话会扫描全表数据,就会有很多的disk read,cpu也会上去,cpu上去后又会影响其它的curd,造成堵塞,一段时间后,cpu就会到100%,最后会导致进程卡死现象。

解决办法

给表的字段加上索引,比如seaxiang.com根据code获取博客,那么给blog表的code字段加上索引。

加上索引后,查询速度明显的快了很多,使用mysql的show processlist也没有sending data状态,cpu明显的降下来。

2  赞