【结论】通过 performance_schema + sys schema 组合可精准拆解三维度耗时,P99 抖动优先排查 Buffer Pool IO 瓶颈。
【依据与步骤】
- 事件关联与维度拆解
- 使用 sys.schema_processlist 关联 performance_schema.threads 表,定位具体线程ID
- 查询 events_waits_summary_by_thread_by_event_name 表,过滤 event_name='wait/io/io_buffer' 的 Buffer Pool IO 等待时间
- 通过 events_waits_current 表实时监控锁等待事件(event_name='wait/synch/mutex/innodb/')
- CPU 时间可通过 events_waits_summary_by_thread_by_event_name 中 event_name='wait/condition/innodb/innodb_cond_wait' 捕获
- 关键 SQL 脚本
-- 三维度耗时拆解视图
CREATE OR REPLACE VIEW query_cost_analysis AS
SELECT
t.THREAD_ID,
SUM(CASE WHEN event_name = 'wait/io/io_buffer' THEN 1 ELSE 0 END) AS buffer_pool_wait,
SUM(CASE WHEN event_name LIKE 'wait/synch/mutex/innodb%' THEN 1 ELSE 0 END) AS lock_wait,
SUM(CASE WHEN event_name = 'wait/condition/innodb/innodb_cond_wait' THEN 1 ELSE 0 END) AS cpu_wait
FROM performance_schema.events_waits_summary_by_thread_by_event_name t
GROUP BY THREAD_ID;
-- 关联线程信息
SELECT
p.THREAD_ID,
p.NAME AS thread_name,
q.buffer_pool_wait,
q.lock_wait,
q.cpu_wait
FROM performance_schema.threads p
JOIN query_cost_analysis q ON p.THREAD_ID = q.THREAD_ID;
- P99 抖动排查优先级
- 首先检查 Buffer Pool IO:
SELECT
SUM( TIMER_WAIT ) / COUNT(*) AS avg_io_wait,
MAX( TIMER_WAIT ) AS max_io_wait
FROM performance_schema.events_waits_summary_by_thread_by_event_name
WHERE event_name = 'wait/io/io_buffer';
- 其次分析锁等待:
SELECT
SUM( TIMER_WAIT ) / COUNT(*) AS avg_lock_wait
FROM performance_schema.events_waits_summary_by_thread_by_event_name
WHERE event_name LIKE 'wait/synch/mutex/innodb%';
- 最后确认 CPU 瓶颈:
SHOW ENGINE INNODB STATUS\G
【验证方法】
- 使用 pt-query-digest 分析慢日志,筛选出 P99 抖动时段的查询
- 通过 sys.schema_table_lock_waits 查看锁等待分布
- 对比调优前后 Buffer Pool 命中率(SHOW ENGINE INNODB STATUS)
- 监控 performance_schema.threads 表中的 THREAD_STATE 字段