B树(B-tree)
注意:之前有看到有很多文章把B树和B-tree理解成了两种不同类别的树,其实这两个是同一种树;
1、概念:
B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构,让我们来看看他有什么特点;
2、规则:
树种的每个节点最多拥有m个子节点且m>=2,空树除外(注:m阶代表一个树节点最多有多少个查找路径,m阶=m路,当m=2则是2叉树,m=3则是3叉);
除根节点外每个节点的关键字数量大于等于ceil(m/2)-1个小于等于m-1个;(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2)
所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子
如果一个非叶节点有N个子节点,则该节点的关键字数等于N-1;
所有节点关键字是按递增次序排列,并遵循左小右大原则;
最后我们用一个图和一个实际的例子来理解B树(这里为了理解方便我就直接用实际字母的大小来排列C>B>A)
![](https://i-blog.csdnimg.cn/blog_migrate/766180bd2a2aa8a68166603b7a254f57.png)
3、B树的查询流程:
如上图我要从上图中找到E字母,查找流程如下
获取根节点的关键字进行比较,当前根节点关键字为M,E要小于M(26个字母顺序),所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);
拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点;
拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);
4、B树的插入节点流程
定义一个5阶树(平衡5路查找树;),现在我们要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来;
遵循规则:
当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于cei(5/2)-1小于等于5-1(关键字数小于cei(5/2)-1 就要进行节点合并,大于5-1就要进行节点拆分);
满足左大右小的排序规则;
![](https://i-blog.csdnimg.cn/blog_migrate/fd7f62891d0c56f6b72aa759e8a10942.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1277f58d777482d67ea8d4687e129793.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6c94a248110b08d0f7b6a7a233d85e5a.png)
5、B树节点的删除
规则:
当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于cei(5/2)-1小于等于5-1;
满足左大右小的排序规则;
关键字数小于二时先从子节点取,子节点没有符合条件时就向向父节点取,取中间值往父节点放;
总结:从平衡二叉树、B树、B+树、B*树总体来看它们的贯彻的思想是相同的,都是采用二分法和数据平衡策略来提升查找数据的速度;
不同点是他们一个一个在演变的过程中通过IO从磁盘读取数据的原理进行一步步的演变,每一次演变都是为了让节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的;
写在前面
大家在面试的时候,肯定都会被问到MySql的知识,以下是面试场景:
![](https://i-blog.csdnimg.cn/blog_migrate/d8f9f9f737e2be2451ba0dac630add32.jpeg)
B树 和B+树是 MySQL索引使用的数据结构,对于索引优化和原理理解都非常重要,下面我的写文章就是要把B树,B+树的神秘面纱揭开,让大家在面试的时候碰到这个知识点一往无前,不再成为你的知识盲点!
1、B树
这里的 B 是 Balance(平衡)的缩写。它是一种多路的平衡搜索树。
它跟普通的平衡二叉树的不同是,B树的每个节点可以存储多个数据,而且每个节点不止有两个子节点,最多可以有上千个子节点。
B树中每个节点都存放着索引和数据,数据遍布整个树结构,搜索可能在非叶子节点结束,最好的情况是O(1)。
一般一棵 B 树的高度在 3 层左右,3 层就可满足 百万级别的数据量
![](https://i-blog.csdnimg.cn/blog_migrate/4bfa808d47582c9de8980efd717570d2.png)
B树 每个节点都存储了一定的范围区间,区间更多的情况下,搜索也就更快。
比如普通的二叉树对于 1~ 100 的索引值,首先分为 1~ 50 和51~ 100 两部分。
而 B树可以分为四个区间 1~ 25, 26~ 50, 51~ 75, 76~ 100 。甚至可以划分为更多区间,这样一次就能排除四分之三的数据
2、B+树
B+树是B树的一种变种,它与 B树 的 区别 是:
叶子节点保存了完整的索引和数据,而非叶子节点只保存索引值,因此它的查询时间固定为 log(n).
叶子节点中有指向下一个叶子节点的指针,叶子节点类似于一个单链表
正因为叶子节点保存了完整的数据以及有指针作为连接,B+树可以增加了区间访问性,提高了范围查询,而B树的范围查询相对较差
B+树更适合外部存储。因为它的非叶子节点不存储数据,只保存索引。
B+树的示意图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/64ad8313c96474896d253372bbbb0159.png)