【结论】通过 performance_schema + sys.schema 联动分析,可拆解单条查询耗时为 IO/锁/CPU 三维度。关键步骤如下:
- 关联查询与等待事件:
SELECT
t.digest,
SUM(CASE WHEN event_name LIKE 'wait/io/%' THEN timer_wait END) AS io_wait,
SUM(CASE WHEN event_name LIKE 'wait/lock/%' THEN timer_wait END) AS lock_wait,
SUM(CASE WHEN event_name LIKE 'wait/synch/%' THEN timer_wait END) AS sync_wait,
SUM(timer_wait) AS total_wait
FROM
performance_schema.events_waits_history_by_thread t
JOIN
performance_schema.events_statements_history_by_thread s
ON t.thread_id = s.thread_id
WHERE
s.digest = 'your_query_digest'
GROUP BY
t.digest;
io_wait捕获 Buffer Pool 页面读取等待(如 page not found)lock_wait捕获行锁/间隙锁等待(需配合 sys.schema_lock_waits 分析)sync_wait包含 softirq 抢占和上下文切换
- 锁等待溯源:
SELECT
r.trx_id AS waiting_trx_id,
r.trx_started AS waiting_start,
b.trx_id AS blocking_trx_id,
b.trx_started AS blocking_start,
r.trx_rows_locked,
r.trx_rows_modified
FROM
sys.schema_lock_waits r
JOIN
sys.schema_lock_waits b
ON r.blocking_trx_id = b.trx_id
WHERE
r.trx_mysql_thread_id = (SELECT thread_id FROM performance_schema.threads WHERE processlist_id = 123);
- 通过 thread_id 关联到具体查询线程
- 分析锁等待时长与阻塞事务的持续时间
- CPU 抢占分析:
perf record -p $(pidof mysqld) -- sleep 60
perf report --stdio | grep 'Softirq'
- 软中断频繁触发可能与磁盘 IO 或网络延迟相关
- 配合 vmstat 查看 context switch 次数
【工具建议】
- 使用 sys.schema_processlist 筛查高耗时线程
- 通过 sys.schema_innodb_metrics 监控 Buffer Pool 状态
- 结合 pt-query-digest 分析慢日志
【踩坑提醒】
- performance_schema 需启用
events_waits_history_size足够大 - 锁等待分析需配合
innodb_lock_wait_timeout调整 - CPU 抢占问题可能涉及存储层配置(如 io_sched_class)