MySQL5.7运行CPU达百分之400处理方案

  • 2019 年 10 月 3 日
  • 筆記

用户在使用 MySQL 实例时,会遇到 CPU 使用率过高甚至达到 100% 的情况。本文将介绍造成该状况的常见原因以及解决方法,并通过 CPU 使用率为 100% 的典型场景,来分析引起该状况的原因及其相应的解决方案。

常见原因
系统执行应用提交查询(包括数据修改操作)时需要大量的逻辑读(逻辑 IO,执行查询所需访问的表的数据行数),所以系统需要消耗大量的 CPU 资源以维护从存储系统读取到内存中的数据一致性。

说明:大量行锁冲突、行锁等待或后台任务也有可能会导致实例的 CPU 使用率过高,但这些情况出现的概率非常低,本文不做讨论。

一、定位问题SQL

  • 数据库CPU超频,首要原因分析为执行SQL导致,先定位正在执行的SQL
# 进入数据库连接工具,或者MySQL命令客户端  # 查询正在执行的SQL  select * from information_schema.`PROCESSLIST` where info is not null;

  • 根据COMMAND、TIME、STATE、INFO三个字段查询SQL信息
  • COMMAND – 执行的数据操作类型
  • TIME – 执行的时间
  • STATE – 执行的状态
  • INFO – 执行的具体SQL

发现很长一段时间,查询都处在 “Sending data”状态

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

这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。

二、使用explain查看SQL使用索引过程

  • explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句

  • 使用方法,在select语句前加上explain就可以了,下面是一个使用explain查询SQL的例子

explain select * from user_info where tel = '17000000000';

三、show profile

  • 为了进一步验证查询的时间分布,于是使用了show profile命令来查看详细的时间分布
  • 首先打开配置:set profiling=on;
  • 执行完查询后,使用show profiles查看query id;
  • 使用show profile for query query_id查看详细信息;
  • 具体使用参考资料:MySQL Sending data导致查询很慢的问题详细分析