概述
经过几天鏖战终于完成了lab2,本lab实现一个支持并发操作的B+树。简直B格满满。
B+树
为什么需要B+树
B+树本质上是一个索引数据结构。比如我们要用某个给定的ID去检索某个student记录,如果没有索引的话,我们可能从第一条记录开始遍历每一个student记录,直到找到某个ID和我们给定的ID一致的记录。可想而知,这是非常耗时的。
如果我们已经维护了一个以ID为KEY的索引结构,我们可以向索引查询这个ID对应的记录所在的位置,然后直接从这个位置读取这个记录。从索引查询某个ID对应的位置,这个操作需要高效,B+树能保证以O(log n)的时间复杂度完成。
B+树的性质
B+树由叶子节点和内部节点组成,和其它树结构差不多,但是对(KEY, VALUE)的个数和排列顺序有要求。
叶子节点:
格式如下:
* ---------------------------------------------------------------------------
* | HEADER | KEY(1) + RID(1) | KEY(2) + RID(2) | ... | KEY(n) + RID(n)
* ---------------------------------------------------------------------------
假设叶子结点最多能容纳个n个(KEY, RID)对,那么该叶子节点任何时候都不能少于n/2向上取整个(KEY, RID)对。假设(KEY, RID)对个数为x,那么x必须满足:
ceil(n/2) <= x <= n
ceil表示向上取整,博客园不支持LaTeX o(╯□╰)o。
KEY是search key,RID是该KEY对应的记录的位置。(KEY, RID)对按照KEY的増序进行排列。
HEADER的结构如下:
* ----------------------------------------------------------------------------------------
* | PageType (4) | LSN (4) | CurrentSize (4) | MaxSize (4) | ParentPageId (4) | PageId(4) |
* ---------------------------------------------------------------------------------------
ParentPageId指向父节点。
内部节点
* -----------------------------------------------------------