信息发布→ 登录 注册 退出

mysql如何排查CPU占用

发布时间:2025-10-01

点击量:
首先确认高CPU是否由MySQL引起,通过top观察mysqld进程;再用SHOW PROCESSLIST查看运行中的SQL,关注长时间运行或锁定状态的查询;开启慢查询日志并设置阈值,利用mysqldumpslow或pt-query-digest分析高频、耗时SQL;对问题SQL执行EXPLAIN检查全表扫描、缺失索引或临时排序等问题,针对性添加索引或重写;借助sys.schema视图监控语句性能;最后评估innodb_buffer_pool_size、max_connections等参数合理性,避免配置不当导致资源争用。

MySQL出现CPU占用过高时,通常和慢查询、锁竞争、配置不合理或并发过大有关。排查需要从系统层到数据库层逐步分析,定位根源。

查看系统级CPU使用情况

先确认是否是MySQL进程导致的高CPU:

  • 使用tophtop
  • P键按CPU排序,观察mysql进程(mysqld)的CPU占用率
  • 若mysqld占比较高,基本可确定问题出在MySQL内部

检查MySQL当前运行的SQL

连接到MySQL,查看正在执行的请求:

SHOW PROCESSLIST;

重点关注:

  • 状态为RunningSending data且时间较长的查询
  • 大量处于Locked状态的语句,可能有锁等待
  • 重复出现的相同SQL,可能是高频低效查询

更详细信息可用:

SHOW FULL PROCESSLIST;

启用并分析慢查询日志

慢查询是CPU升高的常见原因。确保慢查询日志已开启:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_output = 'FILE';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

然后重现高负载场景,用mysqldumpslowpt-query-digest分析日志:

mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

找出执行次数多、耗时长、扫描行数大的SQL重点优化。

检查索引和执行计划

对可疑SQL使用EXPLAIN分析执行计划:

EXPLAIN SELECT * FROM orders WHERE user_id = 123;

关注点:

  • type是否为ALL(全表扫描)
  • key是否为NULL(未走索引)
  • rows是否过大
  • Extra是否有Using filesortUsing temporary

根据结果添加索引或重写SQL。

监控系统性能指标

使用工具辅助判断:

  • innotop:实时查看MySQL线程、锁、事务等
  • performance_schema:启用后可查SQL执行统计
  • sys schema:提供更易读的性能视图,如host_summary_by_statement_latency
SELECT * FROM sys.statement_analysis ORDER BY avg_latency DESC LIMIT 5;

检查MySQL配置合理性

某些配置不当也会加重CPU负担:

  • innodb_buffer_pool_size过小,导致频繁磁盘读
  • query_cache_type开启但命中率低,反而增加开销(MySQL 8.0已移除)
  • max_connections过高,引发过多并发线程竞争

结合服务器内存和负载调整参数。

基本上就这些。关键是从活跃会话入手,结合慢日志和执行计划,找到“吃”CPU的SQL,再优化索引或逻辑。定期巡检能避免问题积累。

标签:# 并发  # 较长  # 再用  # 能有  # 是从  # 较高  # 长时间  # 也会  # 过大  # 过高  # 重写  # 数据库  # mysql  # var  # 线程  # using  # select  # NULL  # sql  # 有锁  # ai  # ssl  # 工具  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!