InnoDB 记录与页
InnoDB 不是一行一行直接散落在磁盘上的,而是按“页”组织数据。理解页结构,有助于理解 B+Tree 索引、页分裂、回表和范围查询。
存储层级
mermaid
flowchart TD
A[表空间] --> B[段 Segment]
B --> C[区 Extent]
C --> D[页 Page]
D --> E[行记录 Record]数据页内部
| 区域 | 说明 |
|---|---|
| File Header | 页的通用头信息 |
| Page Header | 数据页自身状态 |
| Infimum/Supremum | 最小和最大虚拟记录 |
| User Records | 用户真实记录 |
| Free Space | 空闲空间 |
| Page Directory | 页目录,用于快速定位记录 |
| File Trailer | 校验页是否完整 |
页内查找流程
mermaid
flowchart TD
A[定位到数据页] --> B[读取 Page Directory]
B --> C[二分查找槽位]
C --> D[在槽内按链表遍历]
D --> E[找到目标记录或确定不存在]和索引的关系
B+Tree 的每个节点本质上就是一个页。叶子节点保存完整行记录或主键值,非叶子节点保存索引键和页号。范围查询之所以高效,是因为叶子页之间有链表,可以顺序向后扫描。
常见现象
- 插入无序主键会增加页分裂概率。
- 主键越大,二级索引中保存的主键值也越大,索引空间会变多。
- 范围查询扫描的是连续叶子页,不是只定位单条记录。
- 回表是先通过二级索引找到主键,再回聚簇索引找完整记录。
