数据页的空间划分
每个数据页共16KB的大小,划分为如下7个部分
以下为各空间的用途
| 名称 | 中文含义 | 大小 | 描述 |
|---|---|---|---|
| File Header | 文件头 | 38B | 页的通用信息 |
| Page Header | 页面头 | 56B | 数据页的专有信息 |
| Infimum+Supermum | 最小记录和最大记录 | 26B | 两个虚拟的行记录 |
| User Records | 用户记录 | 不确定 | 实际已用的空间 |
| Free Space | 空闲空间 | 不确定 | 页中未使用的空间 |
| Page Directory | 页面目录 | 不确定 | 页中某些记录的相对位置 |
| File Trailer | 文件尾部 | 8B | 校验页是否完整 |
行记录的结构
User Records中的每个行记录包含以下部分的信息
而其中的记录头信息又包含如下内容,但具体每个位置表示什么可以不需要了解这么清楚
行记录之间的关系
在User Records中,一个数据页的多个行记录是由单向链表进行关联的,可以简单理解为每行按照主键值从小到大用单向链表连接
其中的最小记录和最大记录是由页构造的用于作为单向链表头尾的节点,分别指向/被指向最小/最大记录行
Infimum+Supermum和User Records中数据行的关系图
行记录与数据页的关系
Page Directory相当于跳表,记录某些的偏移量(通常是1~8条),用于避免数据较多时需要沿链表一直寻找行记录。而槽位就相当于跳表中的目录索引
数据页与数据页的关系
数据页的File Header会存储上一个页和下一个页的引用,所以多个数据页是通过双向列表来连接的
File Trailer
数据页内存中被修改后,会同步到磁盘,但如果中间发生中断,会造成数据不一致。为了解决这个问题,File Header和File Trailer都有一个校验值,当修改内容校验值会改变。如果发现校验值不一致,则说明同步发生了错误。
