B+Tree,B-Tree详解(本人亲手画图,绝不同网上任意一篇文章)

背景

相信各位不论是大学学习,还是找工作面试一定都遇到过这个问题,对于新手,而言树就是已经一个相对陌生的概念,如今再加上数据库联系起来,更加的是摸不着头脑,最近有点心情打算将我所理解的这块好好写一写

什么是索引

有了索引数据库搜索引擎就可以更快的找到想要的数据,而在磁盘存储器中,未加索引的表他的数据是无序的存放于磁盘上,一行一行的排列,和我们认知中的表很相像,如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引。这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。而且后面会说到MySQL最后所有的数据最后都是通过这个聚集索引获得,不管一开始是什么类型的索引,最后都是通过聚集索引来获取最终值。在这里插入图片描述
在讲B+tree之前先讲一下B-tree,其是一个多路平衡查找树,我们这里仅以查来进行讲解。众所周知,B-tree大致结构与B+Tree类似,具体的区别在于B+Tree的值域均放在叶子节点,而B-tree的值域可以放在非叶子节点。

B-Tree

在这里插入图片描述

对于B-Tree来说,大体结构和B+Tree类似,但区别在于每个节点内都包含了Key值的值域,

  • 优点:目标值如果进来的时候发现目标值刚好等于Key值的话,那么就可以直接将得到的值返回,而不用继续走到叶子节点去。节省了一定的时间,但是这个节省的时间也是相对的,因为同样数据量的B-Tree相对B+Tree而言,树额高度会更高,查找的次数会增加(这个后面会提到)
  • 缺点:相对于B+Tree来说,因为每个节点都包含了值的部分,而磁盘块的大小每次是固定的,例如:InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值,算上树的出度的话,就有1001个出度,而如果要放入值域的话,少说拿一半的空间来放,那么树的键值和指针只剩下了不到8KB的大小,自然出度少了许多,那么整体树的高度就高了。

B+Tree(B-Tree的变体)

在这里插入图片描述

B+tree如上。
每个节点可以理解为一个从磁盘中查询出的数据块,

  1. 首先系统从磁盘中查询出一块数据块1,放入内存中,内存中通过这个数据的Key值进行排序。
  2. 如果目标数字小于19,则用p1去磁盘中找到对应位置的数据,得到磁盘2的数据。
  3. 如果数字大于19小于其后面的值,则使用中间的p2指针去访问磁盘块3。 后面的以此类推。
  4. 最后到了叶子节点每一个,里面都有几个值,到时候再在内存中比较一下,得出最终的值即可,因为这次已经大大缩小的比较范围,且数据量相对整体足够小。

图比较难画,各位将就看一下,如果是在正常的情况下,B+Tree高度要高很多。

B+Tree叶子节点之间有指针,链式环装结构,因为叶子节点是有序排列的,可以进行随机查找。

综合考虑下来,B+Tree的每一次查询均是到树的叶子节点才结束,且由于是平衡树得出树的高度基本相等(正负1之间)。所以B+Tree每次查询的时间都很平均,适合进行扫表操作,或者适合进行一个范围内多个数据的查询。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值