InnoDB 逻辑存储结构
InnoDB 的数据按 表空间 → 段 → 区 → 页 → 行 逐层组织;页是磁盘管理的最小单元,行是数据存放的基本单位。
一、层次结构
Tablespace(表空间,xxx.ibd)
└── Segment(段:数据段 / 索引段 / 回滚段)
└── Extent(区,1MB)
└── Page(页,16KB)
└── Row(行:Trx_id / Roll_pointer / col1 / col2 ...)
| 层级 | 说明 |
|---|---|
| 表空间(ibd 文件) | 一个 MySQL 实例可以对应多个表空间,用于存储记录、索引等数据 |
| 段 | 分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment) |
| 区 | 表空间的单元结构,每个区大小为 1MB;默认页大小 16K,所以一个区有 64 个连续的页 |
| 页 | InnoDB 存储引擎磁盘管理的最小单元,每页默认 16KB |
| 行 | InnoDB 存储引擎数据是按行进行存放的 |
- InnoDB 是索引组织表:数据段就是 B+ 树的叶子节点,索引段即 B+ 树的非叶子节点。段用来管理多个区(Extent)。
- 为了保证页的连续性,InnoDB 每次从磁盘申请 4~5 个区。
二、行格式中的隐藏字段
每行记录除业务字段外,还有两个隐藏字段:
| 隐藏字段 | 含义 |
|---|---|
Trx_id | 每次对某条记录进行改动时,都会把对应的事务 id 赋值给 trx_id 隐藏列 |
Roll_pointer | 每次对某条记录进行改动时,都会把旧的版本写入 undo log,这个隐藏列相当于一个指针,可以通过它找到该记录修改前的信息 |
Trx_id与Roll_pointer是 MVCC 的基础,详见 MVCC。
三、查看表空间文件
-- 查看表的表空间与行格式等信息
SHOW CREATE TABLE tb_user;
-- 查看 InnoDB 全局状态(含表空间、缓冲池、日志等信息)
SHOW ENGINE INNODB STATUS;
# 数据目录下的表空间文件(每表一个 .ibd)
ls /var/lib/mysql/itcast/
速查
-- 查看表的存储引擎与表空间参数
SHOW CREATE TABLE tb_user;
-- 查看 InnoDB 运行状态(缓冲池、日志、锁等待等)
SHOW ENGINE INNODB STATUS;
# 表空间文件位置:每个表一个 xxx.ibd
ls /var/lib/mysql/库名/
| 层级 | 一句话 |
|---|---|
| 表空间 | 存记录与索引,对应 xxx.ibd |
| 段 | 数据段 = B+ 树叶子,索引段 = 非叶子 |
| 区 | 1MB,固定 64 个页 |
| 页 | 16KB,磁盘管理最小单元 |
| 行 | 含 Trx_id、Roll_pointer 两个隐藏字段 |
相关
- InnoDB 架构:内存结构、磁盘结构、后台线程
- MVCC:隐藏字段与 undo log 版本链
- MySQL 体系结构与存储引擎:InnoDB / MyISAM / Memory 对比