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

MySQL5.7运行CPU达百分之400处理方案
用户在使用 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';
具体用法详见:MySQL explain用法和结果的含义
三、show profile
为了进一步验证查询的时间分布,于是使用了show profile命令来查看详细的时间分布
首先打开配置:set profiling=on;
执行完查询后,使用show profiles查看query id;
使用show profile for query query_id查看详细信息;
具体使用参考资料:MySQL Sending data导致查询很慢的问题详细分析
原文地址https://www.cnblogs.com/osheep/p/11294215.html