模块二:InnoDB 存储引擎核心


一、InnoDB 整体架构

InnoDB 是 MySQL 默认存储引擎(8.0+)。

核心能力:

  • 事务支持
  • 行级锁
  • MVCC
  • 崩溃恢复
  • 外键支持

逻辑结构:

  • Buffer Pool(内存层)
  • Redo Log
  • Undo Log
  • 表空间
  • B+树索引

二、记录结构(Row Format)

InnoDB 支持的行格式:

  • Compact(默认)
  • Dynamic
  • Compressed
  • Redundant(已淘汰)

查看表行格式:

1
SHOW TABLE STATUS LIKE 'table_name';

记录结构组成

每条记录包含:

  • 变长字段长度列表
  • 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. 通过二级索引找到主键值
  2. 再通过主键索引查完整数据

五、表空间与数据目录

1️⃣ 系统表空间

默认文件:

  • ibdata1

包含:

  • 数据字典
  • Undo 信息(旧版本)
  • 双写缓冲区

2️⃣ 独立表空间(推荐)

参数:

1
SHOW VARIABLES LIKE 'innodb_file_per_table';

开启后:

  • 每张表生成 .ibd 文件

优势:

  • 便于单表备份
  • 支持空间回收

3️⃣ 数据目录结构

常见文件:

  • .ibd → 表数据文件
  • .frm(5.7以前)→ 表结构
  • ib_logfile* → redo日志文件

查看数据目录:

1
SHOW VARIABLES LIKE 'datadir';

六、InnoDB 关键特性总结

✔ 基于页管理数据
✔ 所有数据组织为 B+树
✔ 主键决定数据物理顺序
✔ 二级索引依赖主键
✔ 支持事务与崩溃恢复


本章核心理解

  • 行数据是如何存储的
  • 页结构决定IO单位
  • 为什么必须设计合理主键
  • 为什么二级索引会回表

下一篇:查询执行与优化原理