性能调查:EXPLAIN ANALYZE 到 OS 层
慢查询日志只给 已完成
语句的墙钟时间,无法区分 等锁 还是
等 IO。MySQL 8.0.18+ 的
EXPLAIN ANALYZE 在计划节点上挂 actual
time;performance_schema 把
mutex、IO、锁 拆到事件。若两者显示 CPU
低、延迟高,应下沉 iostat/perf
看是不是磁盘或 fsync 队列。
一、调查分层
flowchart TD
Q[延迟/吞吐异常] --> EA[EXPLAIN ANALYZE]
EA --> PFS[performance_schema waits]
PFS --> INN[INNODB STATUS 段]
INN --> OS[iostat / perf]
二、EXPLAIN ANALYZE
-- 需本地验证
EXPLAIN ANALYZE SELECT ...;关注:actual time 在 回表
还是 索引范围;rows
估计偏差大时更新统计信息 ANALYZE TABLE。
三、等锁调查
SELECT r.trx_id waiting, b.trx_id blocking
FROM performance_schema.data_lock_waits w
JOIN information_schema.innodb_trx r ON ...
-- 完整 JOIN 需本地根据列名调整对照 第 9 篇。
四、等 IO 调查
| 信号 | 含义 |
|---|---|
Innodb_data_pending_writes |
数据写积压 |
innodb_os_log_written 速率 |
redo 压力 |
PFS wait/io/file/innodb/% |
文件 IO 等待 |
OS 层:iostat -x 看 %util 与
await。
五、CPU 与 mutex
PFS 汇总
events_waits_summary_global_by_event_name 过滤
mutex/innodb——对照 第
1 篇 线程模型。
六、关键要点
- 先计划后等待再 IO,避免直接调参。
- EXPLAIN ANALYZE 需 8.0.18+。
- PFS 与 STATUS 交叉验证。
- OS 层验证 fsync 饱和 与 第 12 篇 组提交。
十、PG 对照
| 步骤 | MySQL | PG |
|---|---|---|
| 计划 | EXPLAIN ANALYZE | EXPLAIN ANALYZE |
| 等待 | PFS events | pg_stat_activity.wait_event |
| IO | InnoDB STATUS / PFS | pg_stat_io |
| 内核 | perf + 符号 | perf + pg_stat |
分层思路一致:计划 → 等待事件 → 存储 → OS。
上一篇:经典故障模式
下一篇:主从切换与数据恢复
参考资料
源码(MySQL 8.0.36)
storage/innobase/— 引擎实现sql/binlog.cc,sql/handler.cc— Server 层交界
官方文档
- MySQL 8.0 Reference Manual, InnoDB / Replication / Backup
相关文章
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【MySQL InnoDB 内核】InnoDB 架构与线程模型
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
【MySQL InnoDB 内核】页结构与行格式
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。
【MySQL InnoDB 内核】Buffer Pool 与 LRU:frame、flush 列表与 young/old 分区
Buffer Pool 实例、LRU 年轻/年老分区、flush 列表、buf_page_get 路径与 read-ahead。
【MySQL InnoDB 内核】Redo Log 内部机制:LSN、mtr 与组提交
Redo log buffer、LSN、checkpoint、mtr 记录类型与 innodb_flush_log_at_trx_commit 语义。