讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在MySQL中查看一条SQL在各执行阶段的CPU与IO开销

夏强同学_1527

夏强同学_1527

发布时间:2026-10-12 17:48:36

|

863人浏览过

|

来源于php中文网

原创

MySQL 8.0.14+ 才稳定支持 performance_schema 完整 stage 生命周期与资源映射,5.7 及以下因缺少关键 stage 事件聚合而基本不可行;需启用 performance_schema 及对应 consumers/instruments,再通过 events_stages_history_long 关联查询各阶段耗时(单位皮秒),但 TIMER_WAIT 仅为 wall-clock 时间,受调度影响大,非精确 CPU/IO 计数器。

如何在mysql中查看一条sql在各执行阶段的cpu与io开销

MySQL 8.0+ 必须用 performance_schema + sys 视图,5.7 及以下基本不可行

MySQL 原生不提供类似 Oracle 的 SQL Monitor 或 PostgreSQL 的 EXPLAIN (ANALYZE, BUFFERS) 那种带实时资源消耗的执行计划。真正能拿到各阶段 CPU/IO 开销的,只有开启 performance_schema 并采集足够细粒度事件——而这个能力在 MySQL 5.7 中受限严重(比如缺少 statement/sql/select 下的 stage 事件聚合),实际可用性低;MySQL 8.0.14+ 才稳定支持完整 stage 生命周期与资源映射。

实操前先确认:

  • performance_schema 必须启用:SELECT @@performance_schema; 返回 1
  • 关键消费者表要打开:UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('events_stages_history_long', 'events_statements_history_long');
  • 阶段事件必须启用:UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'stage/%';

查单条 SQL 各 stage 的耗时与 IO 次数:用 sys.statement_analysis 快速定位,再钻取 performance_schema.events_stages_history_long

sys.statement_analysis 是个聚合视图,能快速看到某类语句平均耗时、扫描行数、临时表使用等,但它不暴露 stage 级别细节。真要看“从 opening tables → System lock → optimizing → statistics → … → Sending data”每个环节的 CPU 时间和物理 IO 次数,得手动关联原始事件表。

典型操作链:

  • 先执行目标 SQL(确保没被 query cache 缓存,可加 SELECT SLEEP(0.01), ... 或用 SELECT /*+ NO_CACHE */ ...)
  • 立刻查:SELECT THREAD_ID, EVENT_ID, SQL_TEXT FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE '%your_key_word%' ORDER BY TIMER_START DESC LIMIT 1;
  • 拿回 THREAD_ID 和该语句的起始 EVENT_ID,再查对应 stages:SELECT EVENT_NAME, TIMER_WAIT, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID = [EVENT_ID] ORDER BY EVENT_ID;

注意:WORK_COMPLETED 对 IO 类 stage(如 stage/sql/Waiting for table flush)常为 0,但对 stage/sql/Sorting result 或 stage/sql/Creating sort index 可能反映内存排序量;TIMER_WAIT 是唯一可靠的时间指标,单位是皮秒(需除以 1000000000 转为毫秒)。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

stage/sql/xxx 名称不等于真实系统行为,尤其 IO 相关 stage 很可能被合并或跳过

MySQL 的 stage 划分是逻辑标记点,不是内核 hook。比如 stage/sql/Opening tables 实际只记录打开表对象的开销,不含底层文件 open() 系统调用的磁盘寻道;stage/sql/Waiting for table level lock 不体现 InnoDB 行锁等待,它只针对 MyISAM 或显式 LOCK TABLES 场景。

真正反映物理 IO 的 stage 极少,常见且相对可信的只有:

  • stage/sql/Waiting for query cache lock(仅限启用 query cache 时,已弃用)
  • stage/innodb/alter table: end(DDL 阶段刷脏页)
  • stage/innodb/insert buffer merge(合并插入缓冲区时触发的随机读)

其余大部分 stage 的 TIMER_WAIT 主要是 CPU 时间,IO 开销需结合 performance_schema.file_summary_by_event_name 或 sys.io_global_by_file_by_latency 单独看文件读写统计,无法按 SQL 语句归属到具体 stage。

替代方案:用 pt-query-digest --explain + mysqld --log-slow-verbosity=full 捕获更贴近实际的资源痕迹

如果非要逼近真实 IO/CPU 分布,且无法升级到 MySQL 8.0.22+(支持 performance_schema.table_io_waits_summary_by_index_usage 细化索引级 IO),建议换路径:

  • 开启慢日志全量采集:SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 0; SET GLOBAL log_slow_verbosity = 'full';
  • 让目标 SQL 走一遍,然后用 pt-query-digest --explain h=localhost,u=root,p=xxx /var/lib/mysql/slow.log 解析,它会把 # Query_time、# Lock_time、# Rows_sent、# Rows_examined 和 EXPLAIN 结果并列输出,间接反映 IO 压力(Rows_examined 高 ≈ 多次磁盘页读)
  • 配合 perf record -e syscalls:sys_enter_read,syscalls:sys_enter_pread64 -p $(pidof mysqld) 抓系统调用,才能看到真实 read/pread64 调用次数与大小——但这已脱离 SQL 层,需运维介入

最易被忽略的一点:stage 事件默认不采集 memory 和 CPU cycle 级别数据,TIMER_WAIT 是 wall-clock 时间,受调度延迟、上下文切换影响极大;同一语句反复执行,各 stage 耗时波动可能达 30% 以上,不要当作精确性能计数器用。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4183

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

891

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1089

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6061

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2943

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6040

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8101

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1110

2024.04.29

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

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

精品课程

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

共1课时 | 183人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn