如何查看MySQL中特定查询的CPU与内存占用情况?
确实,SHOW PROCESSLIST和INFORMATION_SCHEMA.PROCESSLIST只能给你连接的基本信息,拿不到CPU和内存占用——这也是很多DBA日常排查时遇到的痛点。下面给你几个靠谱的方法,从MySQL内部和系统层面都能搞定:
方法1:用MySQL自带的Performance Schema(官方推荐)
Performance Schema是MySQL内置的性能监控模块,默认在5.7及以上版本是开启的(如果没开,需要在my.cnf里加performance_schema = ON然后重启服务)。它能直接追踪每个线程的CPU、内存使用情况,还能关联到PROCESSLIST的信息。
试试这个查询,把进程信息和资源占用整合到一起:
SELECT p.id AS process_id, p.user, p.host, p.db, p.command, p.time, p.state, p.info, t.THREAD_OS_ID AS os_thread_id, -- 对应系统层面的线程ID TIMESTAMPDIFF(SECOND, t.THREAD_START_TIME, NOW()) AS thread_uptime_sec, es.CPU_TIME / 1000000 AS cpu_used_sec, -- 把微秒转成秒 ms.current_allocated AS memory_allocated -- 当前分配的内存(带单位) FROM INFORMATION_SCHEMA.PROCESSLIST p JOIN performance_schema.threads t ON p.id = t.PROCESSLIST_ID LEFT JOIN performance_schema.events_statements_current es ON t.THREAD_ID = es.THREAD_ID LEFT JOIN performance_schema.memory_summary_by_thread_by_event_name ms ON t.THREAD_ID = ms.THREAD_ID AND ms.EVENT_NAME = 'memory/performance_schema' ORDER BY cpu_used_sec DESC; -- 按CPU占用从高到低排序
方法2:用Sys Schema简化查询
如果你觉得Performance Schema的表结构太复杂,MySQL还自带了sys schema——它是基于Performance Schema和Information Schema做的简化视图,专门用来让普通用户快速查看监控数据。
直接查sys.processlist视图就能拿到整合后的资源信息:
SELECT id, user, host, db, command, time, state, info, cpu_time, -- 累计CPU时间 memory_usage, -- 内存占用 os_thread_id FROM sys.processlist WHERE command != 'Sleep' -- 过滤掉休眠的连接 ORDER BY cpu_time DESC;
这个视图已经帮你做好了关联和单位转换,结果一目了然。
方法3:结合系统工具(Linux层面)
如果MySQL内部的监控数据不够细,你还可以结合Linux的系统工具,因为MySQL的每个连接对应一个系统线程(注意:如果用了线程池模式,对应关系会不同,但默认是一个连接一个线程)。
步骤很简单:
- 先从MySQL里拿到线程对应的系统ID:
SELECT id AS process_id, THREAD_OS_ID AS os_thread_id FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL; - 用
ps或top查这个线程的资源占用:- 用
ps:ps -L -p $(pgrep mysqld) -o tid,pcpu,pmem,cmd | grep <os_thread_id> - 用
top实时查看:
在top -H -p $(pgrep mysqld)top界面里,找到对应TID(线程ID)的行,就能看到%CPU和%MEM列的数值。
- 用
内容的提问来源于stack exchange,提问作者Ahasan Al Rabbi




