C++为什么叫C plus plus?
这是由于C++相当于继承C的语法后,增加了各方面的能力,所扩展出的一种新语法。
在软件领域中 plus 有增加的味道。在这里B +树也一样,是B树的增强版。
在学习B+树之前,最好是对B树有一定的了解。不了解的各位也没有关系,可以花费5分钟的时间读我的上一篇文章《数据库索引的基石----B树》。
我在上篇文章的最后,专门提到,由于B树的设计,导致它存在一种天然的劣势,导致典型的B树在很多方面受到了限制。
      这个劣势是什么呢?(自问)
      先想下,为啥我们在类磁盘的数据查找系统中,并没有使用高效的平衡二叉查找树,而设计出了B树?这是由于B树是考虑到了加载硬盘数据到内存是系统瓶颈,所以让节点变重,承载更多的关键字。但是B树在设计时,为了查找方便,节点信息除了包含关键字,还包含了data信息,这就导致每个节点所能包含的最大关键字个数被压缩了。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )这就导致最终并没有达到每次次加载,加载的关键字是最大数目的最优方案。(自答)
基于这个原因,有人对B树进行了改良,提出了B+树(B plus tree)。
也就是下边这个样子


根据B+树的图,我们可以轻易总结出以下几个不同点:
1、 在B+树中,如果一个节点包含n个关键字,那么他就有n个分支。
在B树中,含有n个关键字的节点有n+1个分支。
也就是说B+树是一个关键字对应一个分支,B树是一个关键字的空位置对应一个分支。
2、 B+树中节点的关键字个数范围比对应的B树多1。
3、 B+树的叶子节点包含全部关键字,叶子节点的指针指向关键字对应的数据。
4、 B+树的所有非叶子节点仅仅起到一个索引的作用,即节点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针。不含有该关键字的所对应的数据。
在B树中,每个节点还会额外记录关键字所对应的数据。
5、 B+树中存在一个额外的指针,这个指针指向于包含最小关键字的节点。然后所有的叶子节点从小到大的串联起来,形成一个线性的链表。
最主要的不同点是4、5两点,这里着重解释下第4点:
父节点中关键字的位置是其子节点中所有的关键字中的最大值。
如图中62是子节点(56,62)的最大值96是子节点(62,78,96)的最大值。
96存在于三个节点中,但是它对应的数据只存储在叶子节点中。
而B树如果是相同数据的话,96只会存在一个节点中,而这个节点直接就包含了96对应的数据。
正是由于第4点导致了B+树的查找,系统每次可以从磁盘中加载的数据量更大,调用的IO耗时更少。
而由于第5点的存在,导致B+树在范围查找等方面有了极大的优势。
下边结合上边的B+树,我们来举几个例子:
(1) 查找15
首先加载根节点(50,96),依次比较,发现15≤ 50,匹配成功。
加载50对应的子节点(15,50)。依次比较,发现15=15,匹配成功。
加载15对应的子节点(3,8,15)。依次比较,发现15=15,匹配成功。
由于(3,8,15)是叶子节点,所以可以直接取出对应数据。

(2)查找14
前边都相同,直至加载叶子节点(3,8,15)。
依次比较3,8,不匹配,比较15,发现14<15,并且当前节点是叶子节点,所以匹配失败,B+树不包含14关键字。

(3)查找满足14≤x≤57条件的所有x
同(2)场景,发现14不存在,15是满足条件的最小值,存储15。
加载下一个叶子节点(20,26,27,50),依次比较发现都满足,全部存储。
加载下一个叶子节点(56,62),依次比较发现56满足条件,62超出范围,存储56。
最终得出满足条件的所有数据是{15,20,26,27,50,56}。

由于B+树的种种优势,使得其被广泛应用于各种文件查找系统中,如mysql、MongoDB。在mysql中,你在建立索引所选取的B树,底层的实现正式B+树。另外MongoDB在官方文档中描述,索引使用B树,于是很多文章甚至面试官就想当然的提问,为什么MongoDB没使用B+树,而是使用的B树。其实作者曾经就已作出澄清,底层的实现使用的是B+树。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )而文档写为B树,我们可以理解为B+树是B树的一个增强版。(此处可参考https://q.cnblogs.com/q/127244/)所以当有人问你,为什么mysql使用B+树,而MongoDB使用B树时,你可以给他一个惊喜。

B树的进化版----B+树的更多相关文章

  1. 【Uvalive4960】 Sensor network (苗条树,进化版)

    [题意] 给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值 InputThe input consists of several test cases, separated ...

  2. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  3. SQL优化 MySQL版 - B树索引详讲

    SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

  4. P3379 【模板】最近公共祖先(LCA)(树链剖分)版

    #include <bits/stdc++.h> #define read read() #define up(i,l,r) for(register int i = (l);i < ...

  5. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  6. 【转载】完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...

  7. 洛谷——P1276 校门外的树(增强版)

    P1276 校门外的树(增强版) 题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是 ...

  8. HDU 1166.敌兵布阵-完全版线段树(单点增减、区间求和)

    生活艰辛,且行且珍惜. 先水一篇博客再去补题,要不然又忘记写博客了. 计划系统的刷一遍线段树专题,自己给自己找虐(自作孽不可活),从基础的到后面的,所有的都挂了题,刷题不,大兄弟? 线段树可真有意思, ...

  9. Luogu P1276 校门外的树(增强版)

    Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只 ...

随机推荐

  1. [OI笔记]三种逆元的求法

    其实这篇博客只是搬运一下我之前(大概是NOIP那会)写在word里的笔记- 下面直接复制原话,题目是洛谷上求逆元的模板题:https://www.luogu.org/problemnew/show/P ...

  2. [水题日常]UVA1639 糖果(Candy,ACM/ICPC Chengdu 2012)

    今天来尝试了几道数学期望相关的题,这是我认为比较有趣的一道题 这次不废话啦直接开始~ 一句话题意:两个分别装有n个糖果的盒子,每次随机选一个盒子然后拿走一颗糖(选的概率分别是\(p\)和\((1-p) ...

  3. YouZack英语学习网站,英语四六级的福音

    YouZack英文网站 YouZack英语网站是,杨中科大佬开发给各位有需要的人使用的一个英语学习网站: 网站分两个模块: 听力模块部分图 听力模块界面 听力模块使用说明界面 背单词模块部分图 背单词 ...

  4. JQuery ajax request及Java服务端乱码问题及设置

    今天花了半天功夫才搞定2个乱码问题 1. 原先一直用form提交,现在改作JQuery ajax 提交,发现乱码. 2. window.location url中含有中文提交后,乱码. 第一个问题: ...

  5. 无法获得VMCI驱动程序的版本:句柄无效 (亲测有效! )

    今天在学习Linux 的时候 启动VM时出现了这个问题, 搞了很久终于弄好了, 就写篇博客来记录一下,帮助一下大家,如果对大家有帮助,还请各位哥哥姐姐点个关注,你的支持就是我坚持下去的动力 ! 文章目 ...

  6. UWP 自定义RadioButton实现Tab底部导航

    先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...

  7. 写一个nginx.conf方便用于下载某个网页的所有资源

    写一个nginx.conf方便用于下载某个网页的所有资源 worker_processes 1; events { worker_connections 1024; } http { include ...

  8. [EF] - Code First处理Clustered Index

    Clustered Index <=>集群索引: http://msdn.microsoft.com/en-us/library/ms177443.aspx 由于其特殊性,使得每个tabl ...

  9. Git 使用中遇见的各种问题及解决办法

    一.修改提交代码的用户名以及提交邮箱,(推荐使用方法2,一劳永逸) 方法1(修改.git/config文件): step1:进入工程.git文件夹 step2:vim config step3:末行添 ...

  10. Json串的字段如果和类中字段不一致,如何映射、转换?

    Json串是我们现在经常会遇到的一种描述对象的字符串格式.在用Java语言开发的功能中,也经常需要做Json串与Java对象之间的转换. fastjson就是经常用来做Json串与Java对象之间的转 ...