java面试高频题:mysql中B树和B+树,还不理解B树和B+树,那就看看这篇文章吧

这篇文章主要介绍了还不理解B树和B+树,那就看看这篇文章吧,文中经过示例代码介绍的很是详细,对你们的学习或者工做具备必定的参考学习价值
金九银十近段时间正值找工做的最佳时间,给粉丝们准备了一些大厂面试题想要获取相关大厂的面试题的能够点击这里来获取资料:点击这里哦!!!,暗号:CSDN
如下是部分资料截图(全部资料均已整合成文档,pdf压缩打包处理)。
在这里插入图片描述web

正文

01 B树

在介绍B+树以前, 先简单的介绍一下B树,这两种数据结构既有类似之处,也有他们的区别,最后,咱们也会对比一下这两种数据结构的区别。面试

1.1 B树概念

B树也称B-树,它是一颗多路平衡查找树。二叉树我想你们都不陌生,其实,B树和后面讲到的B+树也是从最简单的二叉树变换而来的,并无什么神秘的地方,下面咱们来看看B树的定义。
•每一个节点最多有m-1个关键字(能够存有的键值对)。
•根节点最少能够只有1个关键字。
•非根节点至少有m/2个关键字。
•每一个节点中的关键字都按照从小到大的顺序排列,每一个关键字的左子树中的全部关键字都小于它,而右子树中的全部关键字都大于它。
•全部叶子节点都位于同一层,或者说根节点到每一个叶子节点的长度都相同。
•每一个节点都存有索引和数据,也就是对应的key和value。数据库

因此,根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m/2 <= k <= m-1。数据结构

另外,咱们须要注意一个概念,描述一颗B树时须要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,通常用字母m表示阶数。svg

咱们再举个例子来讲明一下上面的概念,好比这里有一个5阶的B树,根节点数量范围:1 <= k <= 4,非根节点数量范围:2 <= k <= 4。性能

下面,咱们经过一个插入的例子,讲解一下B树的插入过程,接着,再讲解一下删除关键字的过程。学习

1.2 B树插入

插入的时候,咱们须要记住一个规则:判断当前结点key的个数是否小于等于m-1,若是知足,直接插入便可,若是不知足,将节点的中间的key将这个节点分为左右两部分,中间的节点放到父节点中便可。3d

例子:在5阶B树中,结点最多有4个key,最少有2个key(注意:下面的节点统一用一个节点表示key和value)。指针

插入18,70,50,40
在这里插入图片描述
插入22
在这里插入图片描述
插入22时,发现这个节点的关键字已经大于4了,因此须要进行分裂,分裂的规则在上面已经讲了,分裂以后,以下。在这里插入图片描述
接着插入23,25,39在这里插入图片描述
分裂,获得下面的。分裂,获得下面的。
更过的插入的过程就很少介绍了,相信有这个例子你已经知道怎么进行插入操做了。xml

1.3 B树的删除操做

B树的删除操做相对于插入操做是相对复杂一些的,可是,你知道记住几种状况,同样能够很轻松的掌握的。

如今有一个初始状态是下面这样的B树,而后进行删除操做。
在这里插入图片描述
删除15,这种状况是删除叶子节点的元素,若是删除以后,节点数仍是大于m/2,这种状况只要直接删除便可.
接着,咱们把22删除,这种状况的规则:22是非叶子节点,对于非叶子节点的删除,咱们须要用后继key(元素)覆盖要删除的key,而后在后继key所在的子支中删除该后继key。对于删除22,须要将后继元素24移到被删除的22所在的节点。在这里插入图片描述
此时发现26所在的节点只有一个元素,小于2个(m/2),这个节点不符合要求,这时候的规则(向兄弟节点借元素):若是删除叶子节点,若是删除元素后元素个数少于(m/2),而且它的兄弟节点的元素大于(m/2),也就是说兄弟节点的元素比最少值m/2还多,将先将父节点的元素移到该节点,而后将兄弟节点的元素再移动到父节点。这样就知足要求了。

咱们看看操做过程就更加明白了。
在这里插入图片描述
接着删除28,删除叶子节点,删除后不知足要求,因此,咱们须要考虑向兄弟节点借元素,可是,兄弟节点也没有多的节点(2个),借不了,怎么办呢?若是遇到这种状况,首先,仍是将先将父节点的元素移到该节点,而后,将当前节点及它的兄弟节点中的key合并,造成一个新的节点。在这里插入图片描述
移动以后,跟兄弟节点合并。在这里插入图片描述
删除就只有上面的几种状况,根据不一样的状况进行删除便可。

上面的这些介绍,相信对于B树已经有必定的了解了,接下来的一部分,咱们接着讲解B+树,我相信加上B+树的对比,就更加清晰明了了。

02 B+树

2.1 B+树概述

B+树其实和B树是很是类似的,咱们首先看看相同点:
•根节点至少一个元素
•非根节点元素范围:m/2 <= k <= m-1

不一样点:
•B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点。
•内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的全部key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。
•每一个叶子结点都存有相邻叶子结点的指针,叶子结点自己依关键字的大小自小而大顺序连接。
•父节点存有右孩子的第一个元素的索引。

下面咱们看一个B+树的例子,感觉感觉它吧!
在这里插入图片描述

2.2 插入操做

对于插入操做很简单,只须要记住一个技巧便可:当节点元素数量大于m-1的时候,按中间元素分裂成左右两部分,中间元素分裂到父节点当作索引存储,可是,自己中间元素仍是分裂右边这一部分的。

下面以一颗5阶B+树的插入过程为例,5阶B+树的节点最少2个元素,最多4个元素。

插入5,10,15,20
在这里插入图片描述
插入25,此时元素数量大于4个了,分裂在这里插入图片描述
接着插入26,30,继续分裂在这里插入图片描述
有了这几个例子,相信插入操做没什么问题了,下面接着看看删除操做。

2.3 删除操做

对于删除操做是比B树简单一些的,由于叶子节点有指针的存在,向兄弟节点借元素时,不须要经过父节点了,而是能够直接经过兄弟节移动便可(前提是兄弟节点的元素大于m/2),而后更新父节点的索引;若是兄弟节点的元素不大于m/2(兄弟节点也没有多余的元素),则将当前节点和兄弟节点合并,而且删除父节点中的key,下面咱们看看具体的实例。

初始状态
在这里插入图片描述
删除10,删除后,不知足要求,发现左边兄弟节点有多余的元素,因此去借元素,最后,修改父节点索引在这里插入图片描述
删除元素5,发现不知足要求,而且发现左右兄弟节点都没有多余的元素,因此,能够选择和兄弟节点合并,最后修改父节点索引在这里插入图片描述
发现父节点索引也不知足条件,因此,须要作跟上面一步同样的操做在这里插入图片描述
这样,B+树的删除操做也就完成了,是否是看完以后,以为很是简单!

03 B树和B+树总结

B+树相对于B树有一些本身的优点,能够归结为下面几点。
•单一节点存储的元素更多,使得查询的IO次数更少,因此也就使得它更适合作为数据库MySQL的底层数据结构了。
•全部的查询都要查找到叶子节点,查询性能是稳定的,而B树,每一个节点均可以查找到数据,因此不稳定。
•全部的叶子节点造成了一个有序链表,更加便于查找。

到此这篇关于还不理解B树和B+树,那就看看这篇文章吧的文章就介绍到这了