Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL CPU占用过高

MySQL CPU占用过高的排查指南

作者:明湖起风了

使用关系数据库MySQL版时,如果您的CPU使用率很高或接近100%,会导致数据读写处理缓慢、连接缓慢、删除出现报错等,从而影响业务正常运行,所以本文给大家介绍了MySQL CPU占用过高的排查指南,需要的朋友可以参考下

MySQL CPU 占用过高时,排查具体占用资源的表需结合系统监控、数据库分析工具和 SQL 诊断命令。

一、快速定位问题根源​

确认 MySQL 进程占用 CPU

区分负载类型:QPS 激增 vs. 慢查询

SHOW GLOBAL STATUS LIKE 'Questions';  -- 获取总查询量
SHOW GLOBAL STATUS LIKE 'Uptime';     -- 获取运行时间(秒)
-- QPS = Questions / Uptime

二、定位高资源消耗的表​

​方法 1:实时分析活跃线程​

通过 SHOW FULL PROCESSLIST 或系统表查询当前执行的 SQL 及操作的表:

-- 查看所有活跃线程(非 Sleep 状态)
SELECT * FROM information_schema.PROCESSLIST 
WHERE COMMAND != 'Sleep' AND TIME > 10  -- 筛选执行时间>10秒的线程
ORDER BY TIME DESC;

​方法 2:分析慢查询日志​

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- 记录超过1秒的查询
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
pt-query-digest /var/log/mysql/slow.log --limit 10  -- 输出消耗最高的前10个查询

​方法 3:通过 Performance Schema 定位表级操作​

-- 查看消耗 CPU 最高的 SQL 及其操作的表
SELECT 
  DIGEST_TEXT AS query,
  SCHEMA_NAME AS db,
  COUNT_STAR AS exec_count,
  SUM_TIMER_WAIT/1e9 AS total_time_sec,
  SUM_ROWS_EXAMINED AS rows_examined
FROM performance_schema.events_statements_summary_by_digest 
ORDER BY total_time_sec DESC 
LIMIT 10;

​方法 4:检查表大小与索引状态​

查询表空间占用​:

SELECT 
  TABLE_NAME,
  ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024, 2) AS size_mb,
  TABLE_ROWS
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'your_database'
ORDER BY size_mb DESC;

检查索引有效性​:

-- 查看表的索引情况
SHOW INDEX FROM your_table;
ANALYZE TABLE your_table;

​三、针对性优化措施​

紧急处理​:

终止高消耗线程:

KILL <thread_id>;  -- 从 PROCESSLIST 获取 thread_id

索引优化​:

SQL 重写​:

配置调整​:

增加临时表大小,避免磁盘临时表:

tmp_table_size = 256M
max_heap_table_size = 256M

调整 InnoDB 缓冲池(通常设为物理内存的 70%):

innodb_buffer_pool_size = 8G

架构扩展​:

排查工具推荐​

工具类型推荐工具用途
系统监控top, htop, vmstat定位进程及线程级 CPU 占用
SQL 分析pt-query-digest, EXPLAIN分析慢查询及执行计划
实时诊断SHOW PROCESSLIST, sys.schema查看活跃线程与资源消耗
可视化监控Prometheus + Grafana, PMM长期追踪性能指标(QPS/CPU/锁)

注意​

以上就是MySQL CPU占用过高的排查指南的详细内容,更多关于MySQL CPU占用过高的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文