怎样查询MySQL的Performance Schema排查究竟是哪个线程吃光了CPU资源?

P粉602998670

P粉602998670

2026-07-23

609人浏览

原创

答案是:通过performance_schema.threads查活跃线程是定位高cpu sql的起点,需结合events_statements_summary_by_thread_by_event_name和os层ps/top交叉验证,区分真实cpu密集型与锁争用等伪高cpu场景。

怎样查询mysql的performance schema排查究竟是哪个线程吃光了cpu资源?

performance_schema.threads 找活跃线程

Performance Schema 默认开启(MySQL 5.6+),但部分线程(如后台线程、复制IO/SQL线程)可能被过滤掉,threads 表是起点。先确认哪些线程当前处于活跃状态:

  • SELECT thread_id, name, type, processlist_id, processlist_user, processlist_host, processlist_db, PROCESSLIST_INFO FROM performance_schema.threads WHERE THREAD_ID IN (SELECT THREAD_ID FROM performance_schema.events_statements_current WHERE SQL_TEXT IS NOT NULL) ORDER BY PROCESSLIST_TIME DESC LIMIT 10;
  • processlist_id 对应 SHOW PROCESSLIST 中的 ID,可交叉验证;PROCESSLIST_INFO 是当前执行的 SQL(注意:只保留最近一条,且可能被截断)
  • PROCESSLIST_INFO 为空,不代表没在跑——可能是 sleep 状态、或正在执行非 SQL 操作(如排序、磁盘 I/O 等),需结合其他表判断

events_statements_summary_by_thread_by_event_name 看 CPU 消耗大户

单条 SQL 的执行时间(TIMER_WAIT)不等于 CPU 时间,但高 SUM_TIMER_WAIT 通常伴随高 CPU 占用,尤其当 COUNT_STAR 高 + AVG_TIMER_WAIT 不低时:

  • SELECT thread_id, SUM_TIMER_WAIT, COUNT_STAR, AVG_TIMER_WAIT, SUM_ROWS_AFFECTED FROM performance_schema.events_statements_summary_by_thread_by_event_name WHERE EVENT_NAME = 'statement/sql/select' AND SUM_TIMER_WAIT > 1000000000000 ORDER BY SUM_TIMER_WAIT DESC LIMIT 5;
  • EVENT_NAME 换成 'statement/sql/update''statement/sql/insert' 可排查写操作
  • 注意单位:TIMER_WAIT 是皮秒(ps),1e12 ps = 1 秒;SUM_TIMER_WAIT > 1e12 表示该线程 SQL 累计执行超 1 秒,值得深挖
  • 如果某线程 COUNT_STAR 极高但 AVG_TIMER_WAIT 很低,可能是高频小查询(如心跳检测),未必是 CPU 元凶,得看 events_waits_summary_by_thread_by_event_name

结合 events_waits_summary_by_thread_by_event_name 判断是否卡在等待

真正吃 CPU 的线程,往往 wait 类事件占比低;而大量 wait/io/filewait/synch/mutex 表明它在等资源,CPU 可能并不高——别被表象误导:

MySQL(Linux)
MySQL(Linux)

MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。

下载
  • SELECT thread_id, EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT FROM performance_schema.events_waits_summary_by_thread_by_event_name WHERE thread_id = 123 AND COUNT_STAR > 100 ORDER BY SUM_TIMER_WAIT DESC LIMIT 5;(替换 123 为可疑 thread_id)
  • 重点看 wait/synch/mutex/innodb/ 类事件:若 SUM_TIMER_WAIT 高,说明线程在争抢锁,可能引发 CPU 空转(自旋)
  • wait/io/file/innodb/innodb_data_file 高 → 磁盘 I/O 瓶颈,CPU 可能不高;wait/cpu/cpu 在 MySQL 中并不存在,CPU 使用本身不走 wait 表,所以「CPU 高」必须通过 events_statements_* + 实际 top 输出交叉印证

导出线程栈并关联 OS 层进程

Performance Schema 不提供线程栈或 CPU 使用率百分比,最终确认必须落到 OS 层:

  • threads 表拿到 thread_id,再查 SELECT * FROM performance_schema.threads WHERE thread_id = 123;,记下 PROCESSLIST_ID
  • 在 Linux 上运行 mysqladmin -u root -p processlistSHOW FULL PROCESSLIST;,找到对应 IdStateInfo
  • ps -T -p $(pgrep mysqld) -o pid,tid,%cpu,comm,args | grep -E "(^ *[0-9]+ +123|$(cat /proc/$(pgrep mysqld)/task/*/status 2>/dev/null | grep -B1 'Tgid:.*' | grep -A1 'Tgid' | awk '{print $2}' | head -1))"(实际建议简化:先 ps -eL o pid,lwp,comm,%cpu | grep mysqld,再按 LWP 匹配 thread_id
  • 关键点:performance_schema.threads.THREAD_ID ≠ OS 级线程 ID(LWP),但 MySQL 5.7+ 中 THREAD_ID/proc/<pid>/task/<tid>/status</tid></pid> 中的 Tid 一致(需确认 mysqld 进程 PID)

真正难的不是查哪条 SQL 慢,而是区分「CPU 密集型」和「伪高 CPU(比如大量 mutex 自旋、或频繁上下文切换导致的调度开销)」——这两类在线程栈里表现完全不同,但 Performance Schema 本身不暴露栈帧。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1140

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

755

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

472

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

1378

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

1929

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

618

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

2267

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

1965

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

2417

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 125人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 224人学习

phpEnv手册
phpEnv手册

共0课时 | 0人学习