📜  B+树介绍

📅  最后修改于: 2021-09-28 10:50:51             🧑  作者: Mango

为了实现动态多级索引,一般采用B-tree和B+树。然而,用于索引的 B 树的缺点是它存储数据指针(指向包含键值的磁盘文件块的指针),对应于特定键值,以及 B 节点中的键值-树。这种技术大大减少了可以打包到 B 树节点中的条目数,从而有助于增加 B 树中的级别数,从而增加记录的搜索时间。

B+树通过仅在树的叶节点存储数据指针来消除上述缺点。因此,B+树的叶节点结构与B树的内部节点结构大不相同。这里需要注意的是,由于数据指针只存在于叶节点,所以叶节点必须将所有的键值连同它们对应的数据指针存储到磁盘文件块中,以便访问它们。此外,链接叶节点以提供对记录的有序访问。因此,叶节点形成第一级索引,内部节点形成多级索引的其他级别。叶子节点的一些关键值也出现在内部节点中,简单地充当控制记录搜索的媒介。

从上面的讨论可以明显看出,与 B 树不同,B+ 树有两个顺序,“a”和“b”,一个用于内部节点,另一个用于外部(或叶)节点。

‘a’阶B+树的内部节点结构如下:

  1. 每个内部节点的形式为:

    1 , K 1 , P 2 , K 2 , ….., P c-1 , K c-1 , P c >
    其中 c <= a 并且每个P i是一个树指针(即指向树的另一个节点) ,每个K i是一个键值(参见图表 I 以供参考)。

  2. 每个内部节点都有:K 1 < K 2 < …。 < K c-1
  3. 对于 P i指向的子树中的每个搜索字段值“X”,以下条件成立:
    K i-1 < X <= K i ,对于 1 < i < c 并且,
    K i-1 < X,因为 i = c
    (参考图一)
  4. 每个内部节点最多有“a”个树指针。
  5. 根节点至少有两个树指针,而其他内部节点每个至少有 \ceil(a/2) 个树指针。
  6. 如果任何内部节点具有“c”指针,c <= a,则它具有“c – 1”个键值。


图一

‘b’阶B+树的叶节点结构如下:

  1. 每个叶节点的形式为:
    <1 , D 1 >, 2 , D 2 >, ….., c-1 , D c-1 >, P next >
    其中 c <= b 并且每个D i是一个数据指针(即指向磁盘中键值为 K i 的实际记录或指向包含该记录的磁盘文件块),并且每个K i是一个键值P next指向B+树中的下一个叶节点(参考图二)。
  2. 每个叶节点都有:K 1 < K 2 < …。 < K c-1 , c <= b
  3. 每个叶节点至少有 \ceil(b/2) 值。
  4. 所有叶节点都在同一级别。


图二

使用P next指针可以像链表一样遍历所有的叶子节点,从而实现对存储在磁盘中的记录的有序访问。

B+树的示意图——

优势 –
与具有相同“l”层的 B 树相比,具有“l”层的 B+ 树可以在其内部节点中存储更多条目。这突出了对任何给定键的搜索时间的显着改进。具有较低的级别和 P next指针的存在意味着 B+ 树在从磁盘访问记录时非常快速和有效。