Skip to content

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 的每个节点本质上就是一个页。叶子节点保存完整行记录或主键值,非叶子节点保存索引键和页号。范围查询之所以高效,是因为叶子页之间有链表,可以顺序向后扫描。

常见现象

  1. 插入无序主键会增加页分裂概率。
  2. 主键越大,二级索引中保存的主键值也越大,索引空间会变多。
  3. 范围查询扫描的是连续叶子页,不是只定位单条记录。
  4. 回表是先通过二级索引找到主键,再回聚簇索引找完整记录。