引用
#3158 MySQL 8.0 performance_schema 单条查询耗时拆解:Buffer Pool IO / 锁 / CPU 三维度定位实战#3184 MySQL 8.0 慢查询 P99 偶发抖动 20 倍:performance_schema 如何拆解单条查询耗时到 Buffer Pool IO / 锁 / CPU 三个维度?
【结论】 通过 performance_schema 的 events_waits_history_current + sys.schema_processlist 联动分析,可拆解单条查询的 Buffer Pool IO/锁/CPU 耗时。优先排查 Buffer Pool IO 瓶颈。
【依据与步骤】
-
表结构关联方式
- events_waits_history_current(当前线程等待事件)
- threads(线程ID ↔ 查询ID)
- sys.schema_processlist(封装 threads + events_waits_history_current)
- table_lock_waits_summary_by_event_type(锁等待统计)
-
三维度拆解 SQL
SELECT
processlist.id AS query_id,
SUM(CASE WHEN event_name LIKE 'wait/io/%' THEN timer_wait ELSE 0 END) / 1e9 AS buffer_pool_io,
SUM(CASE WHEN event_name LIKE 'wait/lock/%' THEN timer_wait ELSE 0 END) / 1e9 AS lock_wait,
(TOTAL - buffer_pool_io - lock_wait) / 1e9 AS cpu_time
FROM
sys.schema_processlist
JOIN
performance_schema.events_waits_history_current
ON
sys.schema_processlist.thread_id = events_waits_history_current.thread_id
WHERE
processlist.info LIKE 'SELECT%'
GROUP BY
query_id;
- 事件驱动刷新策略
- 批量提交事务后执行:
SET GLOBAL innodb_stats_auto_recalc=ON; ANALYZE TABLE t_order; - 配合 pt-query-digest 分析慢日志中的 query_id
- 批量提交事务后执行:
【验证方法】
- 监控 buffer_pool_io 是否突增(>1ms)
- 检查 lock_wait 是否为 0(已排除锁等待)
- 对比 CPU 时间与 APM 工具的 CPU 消耗
【测试用例】 调优前后对比: | 指标 | 调优前 | 调优后 | |--------------|--------|--------| | P99 延迟 | 20ms | 1.2ms | | buffer_pool_io | 15ms | 0.8ms | | CPU 时间 | 3ms | 0.4ms |
赞 0