首先让我们来看一看B树以及B+树的概念以及特征:
一、B树
1.B树的概念`steram`<code>sds</code>
B树(balance tree)和B+树应用在数据库索引,可以认为是m叉的多路平衡查找树它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。
2.为什么不采用二叉树作为索引数据结构?
理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一。
3.B树的一些特征
- 关键字集合分布在整颗树中;
- 任何一个关键字出现且只出现在一个结点中;
- 搜索有可能在非叶子结点结束;
- 其搜索性能等价于在关键字全集内做一次二分查找;
- 非叶子结点的关键字个数=儿子数-1;
- 所有叶子结点位于同一层;
4.以3阶B树为例,进行查找关键字5的过程如下:
第一次磁盘IO:把9所在节点读到内存,把目标数5和9比较,5小于9,找小于9对应的节点;
第二次磁盘IO,还是读节点到内存,在内存中把5依次和2、6比较,定位到2、6中间区域对应的节点;
第三次磁盘,跟第二步一样,然后就找到了目标5。
可以看到,b树在查询时的比较次数并不比二叉树少,尤其是节点中的数非常多时,但是内存的比较速度非常快,耗时可以忽略,所以只要树的高度低,IO少,就可以提高查询性能,这是b树的优势之一。
二、B+树
1.B+树的概念
B+树是B树的一个变种,它相较于B树来说查询性能更佳,它也是M阶的多路平衡查找树。
2.B+树的特征
- 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
- 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
- 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
- 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。
3.三阶B+树例图
4.b+树相比于b树的查询优势:
- b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
- b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
- 对于范围查找(3,5,6,8,9,11)来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历,如下两图:
B+树:
B树: