MySQL CPU过高需先区分外部压力或内部低效:系统层确认mysqld进程CPU占比,定位高耗线程并关联SQL;再通过QPS与CPU曲线对比判断是流量激增还是慢查询主导;最后用processlist、慢日志或Performance Schema定位问题SQL,并依执行计划优化索引、排序、临时表及连接管理。
MySQL CPU 占用过高,核心不是“压测一下再调”,而是快速区分是外部压力驱动还是内部执行低效。先看现象,再查根源,最后动手优化——跳过这三步,盲目调参或加索引反而可能让问题更隐蔽。
别一上来就进数据库。先在系统层确认:
mysqld 进程;如果它长期 >80%,继续往下查SHOW PROCESSLIST 或 performance_schema.threads 关联 SQLCPU 高 ≠ SQL 写得差,也可能是流量真的太大:
SHOW GLOBAL ST
ATUS LIKE 'Questions'; 和 SHOW GLOBAL STATUS LIKE 'Uptime';,算出平均每秒查询数不用等慢日志满,现场就能抓到“真凶”:
State 列,重点关注 Sending data(数据传输中)、Copying to tmp table(建临时表)、Sorting result(排序)、Locked(锁住)的语句;Info 列显示不全时,用 SELECT * FROM information_schema.PROCESSLIST WHERE INFO IS NOT NULL
slow_query_log = 1、long_query_time = 1(单位秒),重启后分析日志;注意:即使 long_query_time = 0 也能记录所有查询,适合紧急排查UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%statements%';,然后查 performance_schema.events_statements_summary_by_digest,按 TOTAL_LATENCY 或 EXEC_COUNT 排序找“高频+高耗时”语句找到 SQL 后,别急着改代码。先看执行计划,再定策略:
WHERE DATE(create_time) = '2025-12-20')tmp_table_size 和 max_heap_table_size 是否过小;临时表转磁盘会极大拉高 CPU,适当调大(但别超过物理内存 20%)SHOW STATUS LIKE 'Threads_connected'; 如果接近 max_connections,说明连接没释放,要查应用是否漏关连接,或启用连接池(如 HikariCP)SHOW ENGINE INNODB STATUS\G,看 TRANSACTIONS 和 LOCK WAIT 部分;长事务、未提交更新、gap lock 都可能引发连锁等待