MySQL InnoDB存储引擎架构解读

MySQL InnoDB是兼顾高可靠性与高性能的通用事务型存储引擎,其架构由内存结构(In-Memory Structures)、磁盘结构(On-Disk Structures)以及连接二者的后台线程(Background Threads)组成。


1.InnoDB核心架构

InnoDB 整体采用 WAL(Write-Ahead Logging,预写日志)机制,修改数据时先写内存与 Redo Log,再由后台线程异步刷盘到表空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+--------------------------------------------------------------------------+
| In-Memory Structures |
| +--------------------------------------------------------------------+ |
| | Buffer Pool | |
| | +---------------+ +--------------+ +-----------+ +----------+ | |
| | | Data Pages | | Index Pages | | Undo Pages| | Lock Sys | | |
| | +---------------+ +--------------+ +-----------+ +----------+ | |
| | +-------------------------+ +---------------------------------+ | |
| | | Insert Buffer / Change | | Adaptive Hash Index (AHI) | | |
| | +-------------------------+ +---------------------------------+ | |
| +--------------------------------------------------------------------+ |
| +--------------------------------------------------------------------+ |
| | Log Buffer (Redo Log) | |
| +--------------------------------------------------------------------+ |
+-----------------------------------|--------------------------------------+
| Background Threads (Master, IO, Page Cleaner, Purge)
+-----------------------------------|--------------------------------------+
| On-Disk Structures |
| +---------------------+ +--------------------+ +-------------------+ |
| | System Tablespace | | File-Per-Table | | Undo Tablespaces | |
| | (ibdata1) | | (.ibd files) | | (undo_001, ...) | |
| +---------------------+ +--------------------+ +-------------------+ |
| +---------------------+ +--------------------+ +-------------------+ |
| | Redo Log Files | | Doublewrite Buffer | | General / Temp | |
| | (ib_logfileN) | | File | | Tablespaces | |
| +---------------------+ +--------------------+ +-------------------+ |
+--------------------------------------------------------------------------+

1. 1内存结构 (In-Memory Structures)

  • Buffer Pool(缓冲池):InnoDB 性能的核心。将磁盘页(默认 16KB)缓存至内存,采用改进型 LRU 算法(分为 Young 区与 Old 区,防止全表扫描冲刷热点缓存)。
  • Change Buffer(写缓冲):针对非唯一二级索引的 DML(插入/修改/删除)操作。若目标页未在 Buffer Pool 中,暂存修改,待后续读取该页时合并(Merge),大幅降低随机写 IO。
  • Adaptive Hash Index(自适应哈希索引, AHI):引擎根据查询模式自动构建热点 B+Tree 页的哈希索引,将等值查询复杂度从 $O(\log N)$ 降至 $O(1)$。
  • Log Buffer(重做日志缓冲):缓存未刷盘的 Redo Log,由参数 innodb_flush_log_at_trx_commit 控制向磁盘刷写的时机与频率。

1.2磁盘结构 (On-Disk Structures)

  • Tablespaces(表空间):
  • System Tablespace(系统表空间 ibdata1):存放变更缓冲、双写缓冲区等(早期版本也存 Undo 和数据表)。
  • File-Per-Table Tablespace(独立表空间 .ibd):开启 innodb_file_per_table(默认启用)后,每张表对应独立的 .ibd 文件,存放数据与索引。
  • Undo Tablespaces:存放撤销日志,用于回滚和 MVCC。
  • Doublewrite Buffer(双写缓冲区):解决物理页断裂(Partial Page Write)问题。页从 Buffer Pool 刷盘时,先顺序写入双写缓冲区(连续磁盘空间),再离散写入实际的数据文件 .ibd。若断电损坏,可通过双写缓冲区副本恢复原页后再应用 Redo Log。
  • Redo Log(重做日志文件):一组循环写文件(如 ib_logfile0, ib_logfile1),记录物理修改,保障崩溃恢复(Crash Recovery)。

1.3后台线程 (Background Threads)

  • Master Thread:负责周期性协调调度(Dirty Page 刷盘、Change Buffer 合并、Undo 页回收等)。
  • IO Thread:负责处理异步 IO 请求(包括 Read、Write、Insert Buffer、Log 线程)。
  • Purge Thread:在事务提交后,回收不再需要的 Undo Log 页。
  • Page Cleaner Thread:专门负责将脏页(Dirty Pages)从 Buffer Pool 刷入磁盘,避免 Master Thread 阻塞。

2.InnoDB核心特性

核心特性 实现机制 作用与优势
ACID 事务支持 Redo Log(D/A)、Undo Log(A/I)、锁与 MVCC(I) 完整满足 ACID 语义,保障数据强一致与故障恢复。
聚簇索引 (Clustered Index) 基于主键构建 B+Tree,叶子节点直接存放整行数据 主键查询只需遍历一次索引;二级索引叶子节点存储主键值(需回表获取整行)。
多版本并发控制 (MVCC) DB_TRX_ID + DB_ROLL_PTR + Undo 链 + Read View 读不加锁、读写不冲突;支撑 RC(读已提交)和 RR(可重复读)隔离级别。
细粒度行级锁 Record Lock、Gap Lock、Next-Key Lock 支持高并发写操作;Next-Key Lock 在可重复读级别下解决部分幻读问题。
外键完整性 (Foreign Keys) 原生级声明式完整性约束(ON DELETE/UPDATE CASCADE) 在存储引擎层直接验证多表关联数据的参照完整性。
自动故障恢复 (Crash Recovery) 结合 Checkpoint 与 Redo Log 重放 异常关机或宕机重启时,自动恢复已提交数据并利用 Undo 回滚未提交事务。

3.读写核心执行路径

  • 读取路径:根据主键/二级索引查找 —> 优先在 Buffer Pool 命中;若未命中则由 IO 线程从磁盘读入 Buffer Pool;若涉及事务隔离,则通过行记录的 Roll Pointer 沿 Undo Log 链构建对应版本的快照页。

  • 写入路径:先修改 Buffer Pool 中的数据页(标记为脏页)—-> 写入 Undo Log 生成版本链 —> 写入 Log Buffer—-> 根据刷盘策略将 Redo Log 落盘 –> 后续由 Page Cleaner 线程通过 Doublewrite Buffer 异步刷盘。