1. 数据页的结构
-
1个数据页默认为16KB
-
一个页共有7个部分
- 用户记录都是通过空闲空间中的来增加空间进行记录的
2. 记录在页中的存储
-
存储的记录会按照指定的行格式(如COMPACT 存储到User Record部分 一开始生成页 User Record部分的空间是通过从Free Space部分生申请一个记录大小的空间生成的 当FreeSpace用完了后 如果还有新的记录插入 需要申请新的页
记录在页中存储 但在磁盘上页中每条记录是没有空隙的
-
使用DELETE删除的记录其实还在页中 只是其记录的头信息中的delete_flag设为了1 等插入的信息来覆盖掉被删除的这些记录占用的存储空间 所有被删除的记录会组成一个垃圾链表 记录在这个链表中占用的空间称为可重用空间
min_rec_flag: 介绍B+树索引时解释
-
heap_no: 表示这条记录比物理位置在它前面的那条记录的heap_no大1 (从2开始
- 0是Infimum记录(代表页面中的最小记录
- 1是Supremum记录(代表页面中的最大记录
- 这两条记录单独存储在Infimum和Supremum部分中
-
record_type: 该属性表示当前记录的类型
- 0是普通记录(数据项记录
- 1是B+树非叶结点的目录项记录
- 2是Infimum记录
- 3是Supremum记录
next_record: 表示从当前记录的真实数据到下一条记录的真实数据之前的距离(单位字节 这个属性可以是正值也可以是负值 因为记录在索引B+树中按主键大小存储 所以下一条记录指的是按照主键值由小到大的顺序排列的下一条记录
3. Page Directory页目录
将所有正常的目录(包括Infimum和Supremum记录 不包括垃圾链表中已被删除的记录 划分为几个组
每个组的最后一条记录(组内最大的那条记录)的头信息中的n_owned属性表示该组内共有几条记录
将每个组中最后一条记录在页面中的地址偏移量(即该记录的真实数据与页面中第0个字节之间的距离)单独提取出来 按顺序存储到靠近页面尾部的地方 这个地方就称为页目录 页目录存储的这些地址偏移量称为槽 每个槽占用2字节 1个组对应1个槽
初始情况下 一个数据页中只有Infimum和Supremum记录 Infimum组只能存储这一条记录 而 Supremum组能存储1-8条记录 剩下分组记录的条数范围在4-8之间
插入记录是按照主键从小到大的顺序依次插入的
-
在一个数据页中查找指定主键值的记录(84
- 通过二分法确定该记录所在分组对应的槽 找到该槽所在分组中主键最小的那条记录
- 通过记录的next_record属性遍历该槽所在的组中的各个记录
4. Page Header(页面头部
- 存储在数据页中的记录的状态信息 例如 数据页中存储了多少条记录 FreeSpace在页面中的地址偏移量 页目录中存储了多少个槽等
5. File Header(文件头部
- 描述了一些通用于各种页的信息 比如该页的编号 上一页和下一页是谁
6. File Trailer(文件尾部
- 8字节
- 前4字节代表页的校验和 与File Header中的校验和对应 若二者不同意味着内存磁盘刷新期间发生了错误
- 后4字节代表页面被最后修改时对应的LSN的后4字节