B+树简介

B+树

B+Tree是B树的变体,其定义基本与B树相同,除了:

  • 非叶子节点的子树指针与关键字个数相同(B树的非叶子结点,它的关键字像这里的3阶树有两个,而我们的B树则有3个 (5,10,15)跟指针的个数(p1,p2,p3)是一样的,这表明了B+树能存储更多的关键字)

  • 非叶子节点的子树指针P[i],指向关键字值[k[i],k[i+1])的子树(如下图,这里我们的K[i]假设是10,那么k[i+1]就等于20,那么可以看到10 对应的子树它的值(10,15,18)均小于k[i+1]这里是20,均大于 >= k[i] 也就是10大于或者等于k[i]这个条件不是硬性的,因为也有可能去子树里面的最大值也就是18作为k[i],但是它必须小于k[i+1]的值 (20)就是开区间的值是不变的)

  • 非叶子节点仅用来做索引,数据都保存在叶子节点中 (比如说们们要在下图中找到10我们先找到非叶子节点(5,10,20)中的10,然后在从10对应的叶子节点(10,15,18)中真正的找到数据10,因为叶子节点才存储我们用到的数据,这些数据可能是指向数据文件的指针,有的可能是主键的值 ,有的直接把关键数据存储在这个节点上面了(就像本次对10的查找)总之它是会存储在叶子节点上面的,这也就表明了B+树所有的检索都是从根部开始,检索到叶子节点才能够结束,同时非叶子节点仅用来存储索引,非叶子节点不存储数据的话就能够存储更多的关键字了,这就使得我们的B+树相对于我们的B树来说更矮,咋们B+树的搜索就可以在任意的一个非叶子节点就可以终结掉,也就是他可能把我们的数据文件存储在非叶子节点上)

  • 所有的叶子节点均有一个链指针指向下一个的叶子节点,并按大小顺序链接(那么把这些叶子节点链接起来有什么用呢?大家可以看到B+树的叶子节点,如下都是按照大小来排序的(5,8,9)然后再到(10,15,18)都是按大小顺序来排列的,链接起来的话能够方便我们直接在叶子节点做范围统计,就比如说我们要搜索 >= 10 的数据,我们定位到非叶子节点(5,10,20)中的10之后直接往叶子节点(10,15,18)往后进行统计,而不是回到非叶子节点去做搜索了,也就是说它支持范围统计 >= 10 这样做范围统计,即定位到某个叶子节点之后,便可以从该叶子节点横向的去跨子树去进行统计)
    请添加图片描述

咋们先看看B+树是什么样子 如下图:

请添加图片描述

结论

B+树相对于B树,还有其他树,在文件系统以及数据库系统当中更有优势,原因如下:

  1. B+树的磁盘读写代价更低 (B+树的内部结构并没有指向关键字具体信息的指针,也就是不存放我们是数据,只存放索引信息,因此其内部节点相对于B树更小,如果把所有同一内部节点的关键字,存放在同一板块中,这个板块内容纳的关键字数量也越多,一次性读入内存中的需要查找的数据也就更多,相对来说IO的次数也就降低了)
  2. B+树的查询效率更加稳定(由于内部节点并不是最终指向文件内容的节点,而是叶子节点中关键字的索引,所以呢所有关键字的查找必须有一条从根节点直到叶子节点的路,所有关键字查找的长度相同。导致数据的查询效率也几乎是相同的,稳定的O(longn)
    据的查询效率也几乎是相同的,稳定的O(longn)
  3. B+树更有利于对数据库的扫描 (B树在挺高了磁盘IO性能的同时呢,并没有解决元素的遍历效率低下的问题,而B+树只要遍历叶子节点就可以解决对全部关键字信息的扫描,所以对于数据库中频繁的范围查询 就拿咋们上面的例子来说 要查询 >= 10 的数据,由于它的叶子都是用指针来链接起来的我们就可以从10开始顺着它的指针在叶子里面做范围查询,这样呢是非常的方便的。也就是B+树在做范围查询有着更高的性能,那么因此这也是为什们我们在数据库选择B+树,作为主流索引数据库的原因)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值