文章

优化 MySQL 高 CPU 占用的排查与实用建议

优化 MySQL 高 CPU 占用的排查与实用建议

服务器 MySQL 占用 CPU 过高时,应从以下几个方面系统排查:

1. 查看进程列表,定位高负载 SQL

使用:

1
SHOW PROCESSLIST;

重点关注 CommandQueryTime 较长的进程,分析 Info 字段中的 SQL 语句,优先优化慢 SQL(如加索引、重写语句等)。

字段描述
Id进程标识,KILL 时使用
User当前用户
Host来源 IP:端口
db连接的数据库
Command当前命令(Sleep/Query 等)
Time状态持续时间(秒)
StateSQL 状态
InfoSQL 语句内容

2. 关注休眠(Sleep)线程

大量 Sleep 连接会消耗资源,甚至导致崩溃。建议:

  • 检查连接池配置,避免长时间空闲连接未释放。
  • 适当调小 wait_timeout,防止无效连接堆积。

3. 检查临时表与磁盘 IO

如进程 State 出现 Copying to tmp table on disk,说明临时表过大,已写入磁盘,影响性能。

  • 查看/调整临时表大小:
1
2
SHOW VARIABLES LIKE 'tmp_table_size';
SET GLOBAL tmp_table_size=33554432; -- 32MB

4. 检查最大连接数

1
2
SHOW VARIABLES LIKE 'max_connections';
SET GLOBAL max_connections = 1024;

并发连接数过高会导致 Too many connections 错误。合理设置连接池和最大连接数。

5. 合理设置连接超时

wait_timeout 过大易堆积 SLEEP 进程,过小可能导致连接断开。

1
2
SHOW VARIABLES LIKE 'wait_timeout';
SET GLOBAL wait_timeout = 36000; -- 10 小时

6. 启用并分析慢查询日志

慢 SQL 是高 CPU 的常见元凶。建议:

1
2
3
4
SET GLOBAL slow_query_log = 1;
SHOW VARIABLES LIKE 'slow_query_log_file';
SET GLOBAL long_query_time=4; -- 4 秒
SHOW GLOBAL STATUS LIKE 'Slow_queries';

分析慢查询日志,重点优化 GROUP BY、ORDER BY、JOIN 等语句。

7. 定期维护与优化表/索引

  • 分析表
1
ANALYZE TABLE db.tblname;
  • 检查表
1
CHECK TABLE db.tblname;
  • 优化表(清理碎片):
1
OPTIMIZE TABLE db.tblname;

8. 检查锁与参数配置

  • 检查是否存在锁等待,合理设计事务与索引。
  • 调整服务器参数以提升整体性能,常见参数包括:
    • innodb_buffer_pool_size:InnoDB 缓冲池大小,影响数据和索引缓存能力。
    • key_buffer_size:MyISAM 索引缓冲区大小。
    • table_open_cache:可同时打开的表数量。
    • innodb_log_file_size:InnoDB 日志文件大小,影响恢复和写入性能。
    • max_heap_table_size:内存临时表的最大大小。

建议根据实际业务负载和服务器内存情况合理设置上述参数。

总结

高 CPU 占用通常由慢 SQL、连接管理不善、临时表溢出、表碎片、参数配置不合理等多因素叠加。建议定期巡检、优化 SQL、合理配置参数,并结合慢查询日志持续跟踪。

本文由作者按照 CC BY 4.0 进行授权