(转)B+树的理解

大部分内容转自这篇博文https://www.jianshu.com/p/e5d86a0ba150https://www.cnblogs.com/xueqiuqiu/articles/8779029.html

B树就是B-树。

Mysql用的是B+树

B树和B+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是B树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小

总结:每一磁盘页对应索引树的节点,意思是一磁盘页就是一个节点?

IO次数=树的高度,意思是IO3次即树的高度就是3层?

 

B树

概念:一棵m阶B树是一棵平衡的m路搜索树。
特点:

  • m即所有节点中孩子节点个数的最大值,且M>2;
  • 根结点的儿子数为[2, M];
  • 根结点和叶子结点中间的这部分节点的儿子数为[M/2, M],向上取整(就是除根结点以外的非叶子结点)
  • 非叶子结点的关键字个数=儿子数-1;
  • 所有叶子结点位于同一层

有关b树的一些特性,注意与后面的b+树区分:

  1. 关键字集合分布在整颗树中;
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束;
  4. 其搜索性能等价于在关键字全集内做一次二分查找;

B树查找性能是Log2N

B树的插入

例:用1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15构建5阶B树

因为构建5阶的B树,所以每个节点的关键字个数范围为[2,4]

插入11时,该节点的关键字个数超出范围,进行分裂

之后直接插入4,8,13

当插入10时,节点关键字个数再次超出范围

将子节点分裂

这样的过程循环,关键字个数超就往上顶,上面也超不够顶,就往下分裂

最后结果

查询

如图是一个3阶b树,顺便讲一下查询元素5的过程

1

第一次磁盘IO,把9所在节点读到内存,把目标数5和9比较,小,找小于9对应的节点;

2

2,第二次磁盘IO,还是读节点到内存,在内存中把5依次和2、6比较,定位到2、6中间区域对应的节点; 

3,第三次磁盘IO就不上图了,跟第二步一样,然后就找到了目标5。

可以看到,b树在查询时的比较次数并不比二叉树少,尤其是节点中的关键字非常多时,但是内存的比较速度非常快,耗时可以忽略,所以只要树的高度低,IO少,就可以提高查询性能,这是b树的优势之一。

 

二,b+树

b+树,是b树的一种变体,查询性能更好。m阶的b+树的特征:

  1. 非叶子结点中的子节点数跟关键字数是一样的(b树是关键字数比子节点数少1),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的非叶子结点可以看成是索引部分,结点中仅包含其各子节点中的最大(或最小)关键字。
  4. 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
  5. 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。

之所以非叶子节点要存储各子节点的最大关键字或最小关键字,是因为方便在查询时,确定往哪个子节点查

这个图是仅包含其各子节点中的最大关键字。

6

这个图是仅包含其各子节点中的最小关键字。

b+树相比于b树的查询优势:

  1. b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
  2. b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
  3. 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历,如下两图:

这是B树的范围查找

7

这是B+树的查找

8

 

总结,之所以数据库要选B树或B+树,不选二叉树,目的是为了减少磁盘IO的次数,因为B树和B树结构是矮胖的。

而B+树因为非叶子节点都不存储数据,只存储索引,所以同样大小的磁盘页可以容纳更大的节点元素,这就意味着,数据量相同的情况下,B+树比B-树更加“矮胖”,因此查询时IO次数也更少。

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值