B树 & B+树

1.B树

1.1 B树的特点

B树也称B-树,它是一颗多路平衡查找树。m阶B树有如下特性:

  • 每个节点最多有m-1个关键字。m个子节点。
  • 根节点最少可以只有1个关键字。非根节点至少有Ceil(m/2)个关键字。
  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  • 所有叶子节点都位于同一层(根节点到每个叶子节点的长度都相同)。
  • 所有节点在包含关键字的同时包含关键字对应的数据(即key&value都包含)。

    1.2 B树出现的目的

    B树在二叉树的基础上进行了扩展,从每个节点两个子节点扩展到了最多m个子节点。目的是减小树的高度。带来的影响是减小了跨节点的查询次数,增大了节点内的查询次数,用顺序查找代替了二分查找。
    看起来是一个负优化,但这是基于数据都是存储在内存中。如果数据存储在磁盘中(比如每个节点存在一个磁盘页中)的时候,跨页磁盘读取的代价远高于内存中的顺序查找的。那么减少跨节点间的查询次数(即减小跨页磁盘IO)带来的性能优化会非常显著。
    所以B树是为实现高效的磁盘存取而设计的多叉平衡搜索树。

2.B+树

2.1 B树的特点

m阶B+树有如下特性:

  • 每个节点最多有m个关键字。m个子节点。
  • 根节点最少可以只有1个关键字。非根节点至少有Ceil(m/2)个关键字。
  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字都对应一颗子树。
  • 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。
  • 非叶子节点只包含关键字(只有key),叶子节点同时包含关键字及其对应的数据(即key&value都包含)。

3 B树&B+树的对比

3.1 结构对比

B+树和B树相比,主要的不同点在以下3项:

  • 内部节点中,关键字的个数与其子树的个数相同,不像B树种,子树的个数总比关键字个数多1
  • 所有指向文件的关键字及其指针都在叶子节点中,不像B树,有的指向文件的关键字是在内部节点中。换句话说,B+树中,内部节点仅仅起到索引的作用,
  • 在搜索过程中,如果查询和内部节点的关键字一致,那么搜索过程不停止,而是继续向下搜索这个分支。

3.2 对应的功能对比

根据B+树的结构,我们可以发现B+树相比于B树,在文件系统,数据库系统当中,更有优势,原因如下:

  1. B+树的磁盘读写代价更低B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说I/O读写次数也就降低了。

  2. B+树的查询效率更加稳定由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

  3. B+树更有利于对数据库的扫描B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以对于数据库中频繁使用的range query,B+树有着更高的性能。

参考

https://segmentfault.com/a/1190000020416577
https://blog.csdn.net/guoziqing506/java/article/details/64122287