B树和B+树
一、为什么需要B树
B树和二叉树、红黑树相比较,子树更多也就是路数越多,子树越多表示数的高度越低,搜索效率越高。
二、什么是B树
一种平衡的多叉树,称为B树 。
一棵m阶的B树的满足条件:
- 对于M-树:最多允许有M个孩子,意思就是最多有 M-1 个 key
- 节点中 key 必须按序存储(任何搜索树中都不允许 key 重复,所以永远不会出现 key 相等情况)
性质:
- B-树,一个节点最多只能有 M 个孩子,最多只能有 (M-1)个 key
- 除了根之外的节点,至少(M - 1)/ 2 个 key
- 节点中 key 按序排列
- B-树,所有叶子节点都在同一层–平衡
三、插入的过程
插入过程:
- 所有B-树的插入,只能发生再叶子节点上
- 如果随着插入,破坏了节点最多拥有的key的数量,则会造成节点的分裂—树向上生长
- 最小有 (M- 1)/2 个key
- 所有叶子都在同一层
举例:3阶B树,插入1,2,3,4,5过程:
三、B树的缺点
-
每个节点中既要存索引信息,又要存其对应的数据,如果数据很大,那么当树的体量很大时,每次读到内存中的树的信息就会不太够。
-
B树遍历整个树的过程和二叉树本质上是一样的,B树相对二叉树虽然提高了磁盘IO性能,但并没有解决遍历元素效率低下的问题。
针对以上两个问题,B+树诞生了。
四、B+树
同样插入1,2,3,4,5,B+树插入后为:
B+树相比B树,本质上是一样的,区别就在与B+树的所有根节点都不带有任何数据信息,只有索引信息,所有数据信息全部存储在叶子节点里,这样,整个树的每个节点所占的内存空间就变小了,读到内存中的索引信息就会更多一些,相当于减少了磁盘IO次数,问题1就得到了解决。又由B树的性质可以得到,所有叶子节点都会在同一层,B+树会以一个链表的形式将所有叶子节点的信息全部串联起来,这样,想遍历所有数据信息只需要顺序遍历叶子节点就可以了,方便又高效,问题二就得到了解决。不仅如此,B+树还有一个相应的优质特性,就是B+树的查询效率是非常稳定的,因为所有信息都存储在了叶子节点里面,从根节点到所有叶子节点的路径是相同的。那么,我们总结一下B+树的优点:
- B+树的磁盘读写代价更低
B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的 关键字也就越多。相对来说IO读写次数也就降低了。
- B+树的数据信息遍历更加方便
B+树只要遍历叶子节点就可以实现整棵树的遍历,而B树不支持这样的操作(或者说效率低),而且在数据库中基于范围的查询是非常频繁的,所以数据库索引基本采用B+树
- B+树的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。