页结构
记录头信息
- delete_mask
- 0:没有删除
- 1:删除
- min_rec_mask: B+树的每层非叶子结点中的最小记录都会添加该标记
- n_owned: 该记录拥有多少条记录,也就是该组内共有几条记录,看下边的目录页
- heap_no: 当前记录在页中的位置
- 0:伪记录,最小记录,为0
- 1:伪记录,最大记录,为1
- 最大记录和最小记录不存储在user-records中,放在单独的Infimum + Supremum中
- record_type:当前记录的类型
- 0:普通记录
- 1:B+树非叶结点记录
- 2:最小记录
- 3:最大记录
- next_record:当前记录的真实数据地址到按照主键值由小到大的下一条记录的真实数据地址的偏移量
- infimum最小记录的next_record为本页中主键值最小的记录
- 本页中主键值最大的记录的next_record为supremum记录
- 最大记录的next_record的值为0
Page Directory 页目录
- 将所有正常的记录(包括最大最小记录和没有被标记删除的记录)划分为几个组
- 每个组的最后一条记录的头信息中
n_owned
属性表示该记录拥有多少个记录,也就是组内有多少条记录 - 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近页的尾部的地方,这个地方就是所谓的Page Directory,也就是页目录。页面目录中的这些地址偏移量被称为槽(英文名:Slot),所以这个页面目录就是由槽组成的。
- 槽存储的是地址偏移量
- 最小记录所在的分组只能有一条记录 n_owned为1
- 最大记录所在的分组拥有的记录数只能在1-8之间,n_owned为1-8
- 剩下的分组中记录的条数只能在4-8之间
在一个数据页中查找指定主键值得记录过程
- 通过二分法确定记录所在的槽,找到该槽所在分组中主键值最小的那个记录
- 遍历槽所在的组内的各个记录
PageHeader 页面头部
- page_n_dir_slots:页目录中的槽数量
- page_heap_top:还未使用的空间最小地址,从该地址之后的就是free_space,可以不断分配给user_record
- page_n_heap:本页中记录的数量,包括最小记录最大记录和标记为删除的记录
- page_free:第一个已经标记未删除的记录地址,各个已删除的记录也会通过next_record组成一个链表
- page_garbge:已删除的记录占用的字节数
- 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页定义
FileHeader文件头部
-
不同类型的页都会使用文件头部FileHeader,描述一些针对各种页都通用的一些信息
-
FIL_PAGE_TYPE 当前页的类型