之前说了,一行数据是怎么存储的。现在来看下 数据在页中是怎么存储的
基础知识
- 页是Innodb管理的存储空间的基本单位,一般是16kb
- 页分为好多类型 大概十多种,面试中平时所说的页即为索引页(数据页),当然也有像insert buffer、undo、INODE页等等
数据页结构
一个一个的介绍
1. File Header
所有类型的页都适用 记录页的通用信息
- FIL_PAGE_SPACE_OR_CHKSUM 校验和 其实就是方便比较字符串 用某种算法计算出的一个值 用户校验页面的完整性 和File Trailer 中的值是对应的
- FIL_PAGE_OFFSET 页号
- FIL_PAGE_PREV 、FIL_PAGE_NEXT 上一个和下一个页号 双向链表
- FIL_PAGE_TYPE 页的类型 很多
2. Page Header-页面头部
占用固定的56个字节,专门存储各种状态信息 数据页专用
- PAGE_N_DIR_SLOTS 在页目录中的槽数量
- PAGE_HEAP_TOP 还未使用的空间最小地址,也就是说从该地址之后就是Free Space
- PAGE_N_HEAP 本页中的记录的数量(包括最小和最大记录以及标记为删除的记录
- PAGE_FREE 第一个已经标记为删除的记录地址(各个已删除的记录通过next_record也会组成一个单链表,这个单链表中的记录可以被重新利用)
- PAGE_GARBAGE 已删除记录占用的字节数
- PAGE_LAST_INSERT 最后插入记录的位置
- PAGE_DIRECTION 记录插入的方向
- PAGE_N_DIRECTION 一个方向连续插入的记录数量
- PAGE_N_RECS 该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录)
- PAGE_MAX_TRX_ID 修改当前页的最大事务ID,该值仅在二级索引中定义
- PAGE_LEVEL 当前页在B+树中所处的层级
- PAGE_INDEX_ID 索引ID,表示当前页属于哪个索引
- PAGE_BTR_SEG_LEAF B+树叶子段的头部信息,仅在B+树的Root页定义
- PAGE_BTR_SEG_TOP B+树非叶子段的头部信息,仅在B+树的Root页定义
3. Infimum + Supremum
最小记录和最大记录,两个虚拟的行记录 5 记录头+ 8 固定 表示单词
4. User Records
用户的实际数据。一开始生成页的时候 并没有User Records。插入数据的时候会从 Free Space中申请一个记录大小的空间划分到User Records中。
5. Free Space
空闲页
6. Page Directory-页目录
B+树 的检索是按照页去检索的,但是页中的记录怎么检索呢。实际上,页中也是分了组的,而 Page Directory中记录的就是每组中最大记录的偏移量。每组中的最大的记录行中的n_owned属性即记录这个组中有几条记录。
分组的标准:
- 对于最小记录所在的分组只能有 1 条记录
- 最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间。
7. File Trailer
前4个字节:页的校验和 和 Page Header相对应
后4个字节:页面被最后修改时对应的日志序列位置(LSN)