模块二:InnoDB 存储引擎核心
一、InnoDB 整体架构
InnoDB 是 MySQL 默认存储引擎(8.0+)。
核心能力:
- 事务支持
- 行级锁
- MVCC
- 崩溃恢复
- 外键支持
逻辑结构:
- Buffer Pool(内存层)
- Redo Log
- Undo Log
- 表空间
- B+树索引
二、记录结构(Row Format)
InnoDB 支持的行格式:
- Compact(默认)
- Dynamic
- Compressed
- Redundant(已淘汰)
查看表行格式:
| |
记录结构组成
每条记录包含:
- 变长字段长度列表
- NULL值列表
- 记录头信息
- 列数据
隐藏字段:
- DB_TRX_ID(事务ID)
- DB_ROLL_PTR(回滚指针)
- DB_ROW_ID(隐藏主键)
三、数据页结构(Page Structure)
InnoDB 以"页"为基本单位管理数据。
默认页大小:
- 16KB
页结构组成:
- File Header
- Page Header
- Infimum + Supremum
- User Records
- Free Space
- Page Directory
- File Trailer
核心理解:
数据最终是按"页"加载进 Buffer Pool,而不是按行。
四、B+树索引原理
InnoDB 所有数据都基于 B+树存储。
特点:
- 所有数据存储在叶子节点
- 非叶子节点只存索引键
- 叶子节点之间双向链表连接
1️⃣ 聚簇索引(Clustered Index)
- 数据和主键索引存储在一起
- 表数据本身就是一棵 B+树
- 叶子节点存整行数据
规则:
- 有主键 → 使用主键
- 无主键 → 使用唯一非空索引
- 都没有 → 自动生成隐藏主键
2️⃣ 二级索引(Secondary Index)
- 叶子节点存:索引列 + 主键值
- 查询时需要"回表"
回表过程:
- 通过二级索引找到主键值
- 再通过主键索引查完整数据
五、表空间与数据目录
1️⃣ 系统表空间
默认文件:
- ibdata1
包含:
- 数据字典
- Undo 信息(旧版本)
- 双写缓冲区
2️⃣ 独立表空间(推荐)
参数:
| |
开启后:
- 每张表生成 .ibd 文件
优势:
- 便于单表备份
- 支持空间回收
3️⃣ 数据目录结构
常见文件:
- .ibd → 表数据文件
- .frm(5.7以前)→ 表结构
- ib_logfile* → redo日志文件
查看数据目录:
| |
六、InnoDB 关键特性总结
✔ 基于页管理数据
✔ 所有数据组织为 B+树
✔ 主键决定数据物理顺序
✔ 二级索引依赖主键
✔ 支持事务与崩溃恢复
本章核心理解
- 行数据是如何存储的
- 页结构决定IO单位
- 为什么必须设计合理主键
- 为什么二级索引会回表
下一篇:查询执行与优化原理