
文件格式
|
53
•
空间回收:通过对页进行碎片整理和重写,就可以回收空间。
•
动态布局:从页外部,只能通过槽 ID 来引用槽,而确切的位置是由页内部决定的。
3.6
单元格布局
有了标志位、枚举值和原始类型,我们就可以开始设计单元格布局了。之后将单元格组
合成页,再将页组合成树。单元格分为键单元格和键值单元格两种。键单元格包含一个
分隔键和一个指针,该指针指向两个相邻键
之间
的页。键值单元格包含键和相关联的数
据记录。
我们假定单个页内所有单元格是统一的(例如,要么全是键单元格,要么全是键值单元格;
类似地,要么全都包含定长数据,要么全都包含变长数据,但不能是二者的混合)。这样一
来,单元格的元数据只要在每个页上保存一份即可,而不用让每个单元格都保存一份。
构成一个键单元格需要以下信息:
•
单元格类型(可以从页的元数据推断出来)
•
键的长度
•
该单元格指向的子页的 ID
•
键的数据(以字节表示)
一个变长键的单元格布局可能看起来像这样(对于定长键,不用在每个单元格上保存键
的长度):
0 4 8
+----------------+---------------+-------------+
| [int] key_size | [int] page_id | [bytes] key |
+----------------+---------------+-------------+
我们将定长的字段放在一起,之后是 key_size 个字节。严格来说这不是必需的,但这
可以简化偏移量的计算,因为所有定长字段都可以通过静态的、预先计算好的偏移量来 ...