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)。
也就是下边这个样子html
根据B+树的图,咱们能够轻易总结出如下几个不一样点:
一、 在B+树中,若是一个节点包含n个关键字,那么他就有n个分支。
在B树中,含有n个关键字的节点有n+1个分支。
也就是说B+树是一个关键字对应一个分支,B树是一个关键字的空位置对应一个分支。
二、 B+树中节点的关键字个数范围比对应的B树多1。
三、 B+树的叶子节点包含所有关键字,叶子节点的指针指向关键字对应的数据。
四、 B+树的全部非叶子节点仅仅起到一个索引的做用,即节点中的每一个索引项只含有对应子树的最大关键字和指向该子树的指针。不含有该关键字的所对应的数据。
在B树中,每一个节点还会额外记录关键字所对应的数据。
五、 B+树中存在一个额外的指针,这个指针指向于包含最小关键字的节点。而后全部的叶子节点从小到大的串联起来,造成一个线性的链表。
最主要的不一样点是四、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)是叶子节点,因此能够直接取出对应数据。mysql
(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}。sql
因为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树时,你能够给他一个惊喜。数据库