MySQL CPU占用100%性能异常求助:多用户并发查询故障排查
排查方向与根因定位方法
一、并发连接与进程状态分析
- 实时监控MySQL连接与进程:执行
SHOW FULL PROCESSLIST;,重点关注State列,排查是否大量进程卡在Sorting result、Sending data、Creating sort index这类CPU密集状态,或存在元数据锁等待(只读场景下也可能触发)。 - 核对MySQL连接配置:检查
my.cnf/my.ini中的max_connections、wait_timeout、interactive_timeout,确认是否连接数超限导致频繁创建销毁连接;同时查看thread_cache_size,确保线程复用率足够,避免重复创建线程消耗CPU。 - 匹配Apache并发配置:检查Apache的
MaxRequestWorkers、MaxConnectionsPerChild参数,避免Web层发起超出MySQL承载能力的连接请求。
二、查询语句与索引有效性排查
- 深度分析慢查询日志:注意单条快查询在并发场景下也会引发CPU飙升,比如无索引的小表查询,单条耗时短但45次并发会重复触发全表扫描。统计日志中高频查询,用
EXPLAIN执行这些语句,排查是否出现type=ALL(全表扫描)、Extra列包含Using filesort或Using temporary(CPU消耗大户)。 - 聚焦新增数据库:重点检查新增库内表的索引情况,原库可能已完成索引优化,新增库大概率存在遗漏。
- 排查phpMyAdmin默认行为:确认学生是否执行
SELECT * FROM large_table这类无限制查询,或phpMyAdmin自动触发SHOW TABLES、DESCRIBE等元数据查询,这类操作在并发下会累积消耗CPU。
三、字符集与排序规则影响验证
- 核对跨库字符集一致性:确认新增库与原库的字符集/排序规则是否一致,若存在差异(比如原库用
utf8mb4_general_ci,新增库用utf8mb4_unicode_ci),跨库查询或排序时MySQL可能无法利用索引,触发额外排序计算消耗CPU。 - 定位排序操作消耗:结合
SHOW PROCESSLIST和EXPLAIN,排查是否大量查询触发文件排序,尤其是返回大结果集的场景,排序操作会占用大量CPU资源。
四、MySQL资源与系统层面排查
- 检查缓存配置:确认
innodb_buffer_pool_size是否足够,确保常用数据加载到内存,避免频繁磁盘IO引发CPU上下文切换;若仍启用已废弃的query_cache_size,需检查缓存失效或刷新是否过度消耗CPU。 - 系统资源监控:用
top、vmstat、iostat工具排查:- 是否有其他进程占用CPU,排除系统层面干扰
- 查看
%wa(IO等待)占比,若占比过高说明磁盘IO瓶颈导致CPU频繁等待切换,间接拉高使用率 - 检查内存是否充足,避免swap交换频繁消耗CPU
五、账号权限与元数据锁排查
- 核验新增账号权限:确认只读账号是否包含不必要的权限(如
SHOW DATABASES、LOCK TABLES),这类权限对应的操作在并发下可能触发元数据锁(MDL),导致进程阻塞排队、CPU空转。 - 排查元数据锁:执行
SELECT * FROM performance_schema.metadata_locks;(MySQL 5.7支持),查看是否存在针对新增库表的锁等待。
内容的提问来源于stack exchange,提问作者user23337612
相关产品推荐
相关产品推荐

