InnoDB 存储引擎机制深度拆解
中国工程环境里 PostgreSQL 与 MySQL 并存极普遍,但中文资料要么停在「调参手册」,要么只讲 SQL 层。InnoDB 的 undo log MVCC、gap lock、redo/binlog 两阶段提交、Change Buffer——这些与 PG 的 CLOG 多版本行、行锁、WAL 流复制在设计上有清晰分叉,却缺少一份对着源码讲机制、对着故障讲排查的系统性资料。
本站已完成 PostgreSQL 内核系列(26 篇)、MVCC 源码拆解、存储工程(Buffer Pool、B-Tree、WAL 通用原理)。本系列是这些基础在 InnoDB 中的具体落地,每章末尾设「PG 对照」小节,引用 PG 系列对应篇章,帮助已读 PG 的工程师快速建立差异直觉。
系列定位:第 1–15 章为内核机制线(对着
storage/innobase/源码追踪 DML/查询路径);第 16–20 章为运维实战线(经典故障、性能调查、配置陷阱、主从切换)。版本锚定 MySQL 8.0 LTS(源码引用以mysql-8.0.36tag 为主),5.7 关键差异在文中标注。
系列状态:20 章已全部完成。
推荐入口
- InnoDB 架构与线程模型(第 01 篇):Master thread、purge、IO thread、page cleaner 各自职责,Buffer Pool 与 Log Buffer 的内存布局——读懂所有后续机制的骨架。
- MVCC 与 Read View(第 07 篇):若你已读 PG MVCC 或 PG 第 03 章,从这里切入最快理解 undo log 方案与幻读/gap lock 的关系。
- 经典故障模式(第 17 篇):长事务 undo 膨胀、flush 列表堆积、gap lock 死锁、主从延迟——每个从现象追到内核机制。
一、这个系列要回答的七个问题
InnoDB 的线程模型和内存布局是什么? Master thread、purge thread、read/write IO thread、page cleaner——各自职责?Buffer Pool 如何划分 chunk 与 instance? → 第 1、2 章。
一条 UPDATE 从 SQL 到磁盘经历了什么? Server 层解析 → handler 接口 → Buffer Pool → undo → redo → doublewrite → 数据文件。 → 第 3、4、5、6 章。
InnoDB 的 MVCC 为什么用 undo log 而不是 PG 式的多版本行? Read View、undo 链、RC vs RR、幻读与 gap lock。 → 第 7、8 章。
InnoDB 的锁到底锁的是什么? 记录锁、间隙锁、Next-Key Lock、意向锁、MDL 与 PG 行锁模型的差异。 → 第 9 章。
崩溃恢复时 redo 和 undo 各做什么? Checkpoint、LSN、Mini-Transaction、恢复两阶段。 → 第 5、10 章。
binlog 和 InnoDB redo 如何协调? 两阶段提交、XID、组提交、主从延迟来源。 → 第 11、12、13 章。
InnoDB 最危险的故障模式是什么? 长事务 undo 膨胀、脏页 flush 跟不上、gap lock 死锁、半同步降级。 → 第 16–20 章。
二、篇目依赖关系与推荐阅读路径
flowchart TD
A["01 架构与线程"] --> B["02 页结构与行格式"]
B --> C["03 Buffer Pool"]
C --> D["04 Redo Log"]
B --> K["11 B+Tree"]
D --> E["05 Undo Log"]
E --> F["07 MVCC / Read View"]
F --> G["08 隔离级别与幻读"]
G --> H["09 锁管理器"]
D --> I["10 崩溃恢复"]
D --> J["12 Binlog 2PC"]
J --> L["13 主从复制"]
K --> N15["15 Change Buffer / AHI"]
C --> N15
J --> N14["14 Optimizer / Handler"]
C --> M["16 监控"]
E --> N["17 经典故障"]
N --> O["18 性能调查"]
O --> P["19 主从切换"]
O --> Q["20 配置陷阱"]
推荐阅读路径
| 路径 | 篇目 | 适合 |
|---|---|---|
| A:MySQL DBA 日常 | 1 → 3 → 7 → 9 → 16 → 17 → 20 | 排查问题为主 |
| B:从 PG 转 MySQL | 7 → 8 → 9 → 5 → 12 → 13(每章读 PG 对照) | 建立差异直觉 |
| C:内核开发者 | 1 → 2 → 3 → 4 → 5 → 10 → 11 | 存储与恢复 |
| D:高可用 | 4 → 12 → 13 → 19 | 复制与切换 |
| E:应急 | 17 → 18 → 20 → 16 | 先止血再深入 |
| F:查询优化 | 11 → 14 → 15 | 索引与 handler 交界 |
三、目录与每篇一句话价值
第一部分:体系结构(第 1–2 章)
InnoDB 架构与线程模型 InnoDB 在 MySQL Server 中的 handler 边界、后台线程职责表、
srv0srv.cc启动路径、Buffer Pool / Change Buffer / AHI / Log Buffer 内存全景。页结构与行格式 FIL 页头、Infimum/Supremum、聚簇索引与二级索引、
ROW_FORMAT差异、rem0rec.h行头字段——对照 PG 的PageHeaderData。
第二部分:存储与崩溃恢复(第 3–6 章)
Buffer Pool 与 LRU chunk/frame、年轻/年老 LRU 分区、flush 列表、
innodb_old_blocks_pct与buf0buf.cc源码路径。Redo Log 内部机制 LSN、checkpoint、mtr、组提交与
innodb_flush_log_at_trx_commit语义。Undo Log 与事务回滚 undo segment、insert/update undo、purge 线程、长事务 undo history 堆积。
Doublewrite 与页完整性 部分页写问题、doublewrite buffer 两阶段写、8.0 变体。
第三部分:并发控制(第 7–10 章)
MVCC 与 Read View 隐藏列、Read View 构造、RC vs RR 可见性算法、
read0read.cc源码路径。隔离级别与幻读 当前读 vs 一致性读、RR 下 gap lock 与幻读复现实验。
锁管理器 记录锁、间隙锁、Next-Key Lock、死锁检测与
data_locks观察。崩溃恢复 redo apply → undo rollback、
recv_recovery_from_checkpoint_start两阶段。
第四部分:索引、复制与查询(第 11–15 章)
B+Tree 与索引 聚簇索引即数据、二级索引回表、页分裂
btr_page_split、覆盖索引。Binlog 与两阶段提交 redo 与 binlog 的 XA 协议、
ordered_commit组提交、sync_binlog与持久性组合语义。主从复制机制 异步/半同步/GTID、MTS 并行复制、
Seconds_Behind_Master陷阱与延迟诊断。Optimizer 与 Handler 交界
handler::index_read、ICP、MRR、覆盖索引与EXPLAIN ANALYZE解读边界。Change Buffer 与 AHI ibuf 延迟二级索引写、merge 时机、8.0 默认关闭 AHI 的工程背景。
第五部分:运维实战(第 16–20 章)
监控体系
SHOW ENGINE INNODB STATUS段落精读、Performance Schema 锁/事务/内存表、mysqld_exporter 指标映射。经典故障模式 长事务 undo 膨胀、脏页 flush 风暴、gap lock 死锁链、主从延迟——现象、机制、排查 SQL、修复边界。
性能调查方法论 EXPLAIN ANALYZE → PFS 等待事件 → INNODB STATUS → iostat/perf 的分层调查法。
主从切换与数据恢复 mysqldump vs xtrabackup、binlog PITR、GTID failover 与
RESET MASTER边界、误删恢复极限。配置陷阱
innodb_buffer_pool_size、持久性参数组合、innodb_lock_wait_timeout、max_connections内存——症状与查验。
四、与其他系列的联动
| 系列 | 联动 |
|---|---|
| postgresql-kernel | 每章 PG 对照小节 |
| db/mvcc | 第 7 章前置 |
| storage | Buffer Pool、B-Tree、WAL 通用原理 |
| distributed | 复制一致性理论背景 |
| observability | 第 16 章 mysqld_exporter 与 SLO |
五、写作进度
| 状态 | 篇目 |
|---|---|
| 已完成 | 01–20(全系列) |
系列 index v2,2026-06-18 — 系列完结
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【MySQL InnoDB 内核】B+Tree 与索引:聚簇、回表与页分裂
从 btr0btr.cc 拆解 InnoDB B+Tree:聚簇索引即数据、二级索引回表、Page Directory、btr_cur_search_to_nth_level、页分裂 btr_page_split 与合并、索引 latch。对照 PG nbtree。
【MySQL InnoDB 内核】主从复制:异步、半同步、GTID 与并行回放
拆解 Dump/IO/SQL 线程、GTID、WRITESET 并行复制、半同步等待点与 Seconds_Behind_Master 陷阱。
【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 语义。