performance_schema 的定位
performance_schema 是 MySQL 自带的运行时监控库:当前哪些语句在跑、各自耗时多少、在等什么锁、哪类语句模板最耗资源,都可以用普通 SQL 查到。它把原来只能靠猜的问题变成可查询的事实,缺点是需要理解表之间的关联关系,直接上手时容易被表名淹没,通常按「当前语句、语句汇总、等待事件」三个方向切入最快。
基本信息
| 适用平台 | MySQL 5.7 / 8.0、MariaDB(实现略有差异) |
|---|---|
| 开关参数 | performance_schema=ON(默认开启,需要重启修改) |
| 常用表 | events_statements_current、events_statements_summary_by_digest |
| 等待相关 | events_waits_current、data_lock_waits |
| 前置知识 | digest 会把常量替换为占位符,用于语句聚类 |
典型使用场景
- 线上慢时先看当前正在执行的语句与耗时分布
- 按语句模板找出总耗时最高的 SQL,而不是只看单次最慢
- 排查锁等待:查看当前等待事件与阻塞关系
- 评估某类业务的资源占用,为优化排优先级
- 对比变更前后的语句耗时变化,验证优化效果
看当前最慢语句
看当前最慢语句
SELECT thread_id, event_name, timer_wait/1e12 AS sec, sql_text
FROM performance_schema.events_statements_current
WHERE sql_text IS NOT NULL
ORDER BY timer_wait DESC
LIMIT 10;
-- 按语句模板聚合,找资源消耗最大的 SQL
SELECT schema_name, digest_text, count_star,
avg_timer_wait/1e12 AS avg_sec,
sum_rows_examined / count_star AS rows_per_exec
FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC
LIMIT 10;
-- 查看当前等待事件(锁、IO 等)
SELECT * FROM performance_schema.events_waits_current LIMIT 20;常用表与用途
| 表 | 内容 | 使用提示 |
|---|---|---|
| events_statements_current | 当前连接正在执行的语句 | 配合 timer_wait 排序找长耗时 |
| summary_by_digest | 按语句模板聚合的累计统计 | 关注 sum 与 avg 两个口径 |
| events_waits_current | 当前等待事件 | 定位锁与 IO 等待 |
| data_lock_waits | 行锁等待关系 | 找到持有方与被阻塞方 |
| table_io_waits_summary_by_index_usage | 索引使用统计 | 判断索引是否真的被使用 |
| setup_consumers | 采集开关 | 相关消费者关闭时视图为空 |
digest_text 已把常量归一化成占位符,适合聚合统计;要看具体语句原文时查对应的 history 表,但保留条数受参数限制。
查询监控表本身也消耗资源:高频轮询 performance_schema 会给实例增加可观开销,日常巡检建议使用 sys 视图或外部采集器控制频率。