MySQL performance_schema需服务器端启用并配置,客户端无采集能力;须确认performance_schema=ON、启用statements相关instrument与consumer、注意皮秒单位换算及内存数据易失性。

必须在 MySQL 服务器端配置 performance_schema,客户端装完不等于能监控——它只是个连接工具,不带采集能力。
确认 performance_schema 是否已启用
执行 SHOW VARIABLES LIKE 'performance_schema';,返回值必须是 ON。如果为 OFF 或空,说明未启用,即使 MySQL 5.7+ 默认开启,也可能被配置文件显式关掉。
- 检查配置文件(
/etc/my.cnf、/etc/mysql/my.cnf或 Windows 下的my.ini)中是否存在performance_schema = OFF或注释掉了该行 - 修改为
performance_schema = ON后必须重启 MySQL 服务,SET GLOBAL无法动态开启此功能 - 验证是否加载成功:运行
SELECT COUNT(*) FROM performance_schema.threads;,结果大于 0 才表示正常工作
启用 SQL 语句级事件采集
默认情况下,performance_schema 只开启部分 instrument,events_statements_* 表可能为空。需手动启用 SQL 监控:
- 执行
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/sql/%'; - 再启用对应 consumer:
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('events_statements_current', 'events_statements_history', 'events_statements_history_long'); - 注意:这些更新只在当前实例生命周期内有效,重启后需重做,或写入配置文件的
[mysqld]段落中(MySQL 8.0.22+ 支持setup_*表持久化)
查慢 SQL 的实时摘要与原始语句
用 events_statements_summary_by_digest 看聚合统计,用 events_statements_history_long 查具体执行记录:
- 查平均耗时超 1 秒的语句:
SELECT DIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT/1000000000000 AS sec FROM performance_schema.events_statements_summary_by_digest WHERE SUM_TIMER_WAIT > 1000000000000 ORDER BY SUM_TIMER_WAIT DESC LIMIT 5; - 查最近 10 条完整 SQL(含参数):
SELECT SQL_TEXT, TIMER_WAIT/1000000000000 AS sec, THREAD_ID FROM performance_schema.events_statements_history_long ORDER BY TIMER_START DESC LIMIT 10; - 注意:历史表数据仅驻留内存,
history_long容量受performance_schema_events_statements_history_long_size参数限制,默认 10000 行,超限会自动覆盖
别漏掉 slow_query_log 和 sys 视图的配合
performance_schema 是实时、细粒度的,但不替代慢查询日志——后者更稳定、可归档、易分析。两者要一起用:
- 确保
slow_query_log = ON且long_query_time设为合理值(如0.5),并设log_output = TABLE可让日志也写入mysql.slow_log表,方便 SQL 查询 - 优先用
sys.statement_analysis查慢 SQL,它底层就是加工performance_schema数据,字段命名和排序更直观,比如avg_latency单位已是秒,不用自己除 10^12 - 真正难定位的问题往往出现在“单次极慢但平均不慢”的场景,这时必须查
events_statements_history_long,而不是只看摘要表
最易被忽略的是:performance_schema 的计时单位是皮秒(10⁻¹² 秒),所有 TIMER_* 字段直接参与计算时必须除以 1000000000000;另外,它的数据完全在内存里,服务器一重启就清空,不能当长期审计日志用。



















