SHOW PROFILE 已在 MySQL 8.0.22 中被彻底移除,执行会报错 ERROR 1064;其功能由 performance_schema 全面替代,需启用对应 consumers 和 instruments 后查询 events_statements_history_long 等表获取各阶段耗时。

SHOW PROFILE 已在 MySQL 8.0.22 中被彻底移除,无法再用它查看 SQL 执行各阶段耗时。如果你正在用 8.0.22 或更高版本(当前最新稳定版为 8.0.34),执行 SHOW PROFILE 会直接报错:ERROR 1064 (42000): You have an error in your SQL syntax。别白费力气去查文档或调参——它真没了。
为什么 SHOW PROFILE 不再可用
MySQL 官方明确将 SHOW PROFILE 和 SHOW PROFILES 标记为“deprecated”后,在 8.0.22 版本中正式删除。原因很实际:该功能依赖线程级性能采样,开销不可控,且与 performance_schema 的能力严重重叠。现在所有执行阶段的耗时、内存、CPU、IO 等指标,都统一由 performance_schema 提供,更细粒度、更可靠、可开关。
- 它不是“被隐藏”或“需要开启参数”,而是源码里已删干净
-
have_profiling系统变量在 8.0.22+ 中已不存在,SET profiling = 1会报错 - 即使降级到 8.0.21,也不建议用于生产——采样本身会影响查询响应时间
替代方案:用 performance_schema 查执行阶段耗时
核心路径是启用相关消费者(consumer)和仪器(instrument),然后查 events_statements_history_long 或带阶段信息的汇总表。关键步骤如下:
- 确认
performance_schema已启用:SELECT @@performance_schema;必须返回1 - 开启语句阶段追踪:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_history_long'; - 启用阶段事件采集:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'stage/%'; - 执行你的目标 SQL(比如
SELECT * FROM orders WHERE status = 'shipped' LIMIT 100;) - 查阶段耗时:
SELECT EVENT_NAME, TIMER_WAIT/1000000000 AS wait_sec FROM performance_schema.events_statements_history_long WHERE SQL_TEXT LIKE '%orders%' ORDER BY TIMER_START DESC LIMIT 1;,再用该语句的EVENT_ID关联events_stages_history_long查各阶段明细
注意:events_statements_history_long 默认只存最后 10000 条语句,高并发下容易被覆盖;如需长期留存,得配合 TABLE 类型的 consumer 或导出到外部监控系统。
真正实用的瓶颈定位组合拳
单看“哪个阶段耗时长”往往不够,必须结合上下文交叉验证:
- 如果
stage/sql/Sorting result耗时高 → 检查是否缺失排序字段索引,或ORDER BY字段没走索引,触发Using filesort - 如果
stage/sql/Searching rows for update或stage/innodb/row_lock_waits明显 → 存在行锁争用,查INFORMATION_SCHEMA.INNODB_TRX和INNODB_LOCK_WAITS - 如果
stage/sql/Sending data占比异常大(尤其远超stage/sql/Executing)→ 很可能在构造结果集时做了大量计算、函数调用或临时表回写,而非单纯读数据 - 永远同步看
EXPLAIN FORMAT=TREE输出,确认优化器选的执行计划是否合理;rows_examined远大于rows_sent是典型扫描浪费信号
performance_schema 的数据是内存态的,重启即丢;想持续观察,得搭配 slow query log(设 long_query_time = 0)和 sys.schema_table_statistics 这类聚合视图——但别指望一个命令包打天下。


















