MySQL自带的Performance Schema是监控查询性能的重要工具,它通过在数据库内部埋点采集各类事件,让我们能够清楚看到每条SQL的执行耗时、扫描行数以及等待资源的情况,而不依赖慢查询日志的阈值设定。

一、开启Performance Schema
默认情况下Performance Schema是开启的,若未启用可在配置文件添加以下参数并重启:
[mysqld] performance_schema=ON
登录后可通过如下语句确认状态:
SELECT * FROM performance_schema.setup_actors; SHOW VARIABLES LIKE 'performance_schema';
二、核心监控表介绍
Performance Schema包含多张以events_开头的表,常用的有:
- events_statements_current:当前正在执行的语句
- events_statements_history:近期执行过的语句
- events_statements_summary_by_digest:按SQL摘要聚合的统计
关键字段说明
| 表名 | 主要用途 |
|---|---|
| events_statements_summary_by_digest | 定位高频或高耗时SQL模板 |
| events_waits_summary_global_by_event_name | 查看锁、IO等等待事件分布 |
三、实战:找出最耗时的查询
利用摘要表可以快速获取平均耗时最高的SQL:
SELECT DIGEST_TEXT,
COUNT_STAR AS exec_count,
ROUND(AVG_TIMER_WAIT/1000000000000, 3) AS avg_sec,
ROUND(SUM_TIMER_WAIT/1000000000000, 3) AS total_sec
FROM performance_schema.events_statements_summary_by_digest
ORDER BY AVG_TIMER_WAIT DESC
LIMIT 10;
以上查询将等待时间从皮秒转换为秒,方便阅读。若发现某类SQL平均执行时间异常,可进一步关联events_statements_history查看具体参数。
监控等待事件
当查询变慢但SQL本身不复杂时,多半是等待导致,可用如下语句观察:
SELECT EVENT_NAME,
COUNT_STAR,
ROUND(SUM_TIMER_WAIT/1000000000000, 3) AS wait_sec
FROM performance_schema.events_waits_summary_global_by_event_name
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
四、生产环境使用建议
Performance Schema会带来少量开销,建议仅开启需要的消费者,避免全量采集影响线上吞吐。
可通过setup_consumers表控制写入范围:
UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE '%history%';
结合定时任务将摘要数据落盘到独立库,便能搭建轻量且持续的MySQL查询性能监控体系。
MySQLPerformance_Schema查询性能监控修改时间:2026-07-27 09:03:17