页结构的演进-分槽页

前言

读《数据库系统内幕》有感,个人感觉分槽页是个很难理解的概念,也是很实用的知识。

正文

原始的B树论文描述了一种简单的,用于定长数据的页组织方式:

image-20210214170013416

这种页有这样两个缺点

  • 除非往最右侧插入数据,否则需要移动前面的数据
  • 无法有效地管理变长地字段

所以这里自然而然地思考,因为要存储变长的数据。

变长的数据需要回收。

回收完的数据需要移动。

但是对外的偏移量不能变,这个变动会非常麻烦,至少聚簇索引需要变动,根据实现不同,甚至二级索引也要跟着更新

我们的需求是

  • 最小开销存储变长记录
  • 回收已删除记录占用地空间
  • 引用页中地记录,无论记录在哪

image-20210214165732666

分槽页通过加了一层结构,页外指针的引用都通过前面的指针引用,包括二分查找也通过前面的指针引用,来解决这个问题。如果不涉及页的变动,一切变化都在分槽页内完成。

分槽页如何解决上述问题:

  • 最小开销:分槽页唯一的额外开销是一个指针数组,用于保存记录实际所在位置的偏移量
  • 空间回收:通过对页进行碎片整理和重写,就可以回收空间
  • 动态布局:从页外部,只能通过槽ID来引用槽,而确切的位置是由页内部决定的