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.每个位置有三种情况:空穴,树苗,树(而不只 ...

  10. 【解题报告】VijosP1448校门外的树(困难版)

    原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...

随机推荐

  1. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  2. [Linux] VIM 常用快捷键2

    如何使用MacVim 1.在插入模式之外 基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面 VIM 就像一个“哑巴”编辑器一样.很多新手都会一直呆在插入模式里面,因为这样易于使用.但 ...

  3. gcc/g++ 静态动态库 混链接.

    我的环境: centos6 x64. gcc4.4.7 在使用gcc/g++ 编译程序时我们希望指向一些库是使用静态的链接方式. 另外的一些是动态的方式. 我以boost 为例. 如果我们要使用静态库 ...

  4. 文件Copy和文件夹Copy

    文件Copy和文件夹Copy using System.Collections.Generic; using System.Linq; using System.Text; using System. ...

  5. C#动态引用DLL的方法

    C#编程中,使用dll调用是经常的事,这样做的好处是非常多的,比如把某些功能封装到一个dll中,然后主程序动态调用这个dll. 废话不多说,举例说明如下. 首先,我们需要封装一个dll,vs2008下 ...

  6. WIX: Hide installed program from the Add/Remove Programs window.

    Reference article : How to hide an entry in the Add/Remove Programs applet? In Wix source files, set ...

  7. Unity应用架构设计(11)——一个网络层的构建

    对于客户端应用程序,免不了和远程服务打交道.设计一个良好的『服务层』能帮我们规范和分离业务代码,提高生产效率.服务层最核心的模块一定是怎样发送请求,虽然Mono提供了很多C#网络请求类,诸如WebCl ...

  8. DNS解析出现错误故障解决

    当DNS解析出现错误,例如把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,就无法通过域名访问相应的站点了,这就是DNS解析故障.出现DNS解析故障最大的症状就是访问站 ...

  9. linux环境中,如何解压后缀是bz2的压缩包?tar.bz2格式的压缩包,如何进行解压?

    问题说明: 今天下载了一个nagios中文的包,名字nagios-cn-3.2.3.tar.bz2,即以tar.bz2结尾,经常解压tar.gz 突然想不起来这个用什么命令来解压了.百度了下,再次记录 ...

  10. 【python】bytes与字符串的相互转化

    代码: # bytes转字符串方式一 b=b'\xe9\x80\x86\xe7\x81\xab' string=str(b,'utf-8') print(string) # bytes转字符串方式二 ...