B树系列解析(B树、B+树以及B-树)

我们知道MySQL中InnoDB存储引擎的索引结构默认采用的就是B+Tree(多路平衡查询树),多路平衡查询树顾名思义,与二叉查询树的区别就是多路平衡查询树每个节点可以对应多个子节点,也就是说一个节点对应多个分支,这样简单想来最起码一颗树上存的数据就比二叉查询树能多很多对吧!这也是InnoDB考虑到的一个因素吧!
下面开始本文的正式内容:

一、B Tree

B树是一种多叉搜索树,需要注意的是并不是所有多叉搜索树就都是B树。
详细定义如下:

B Tree的索引结构图:
在这里插入图片描述
在这里插入图片描述
B树的特点:
(1)所有键值(key)分布在整棵树中
(2)搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找
(3)每个结点最多拥有m个子树
(4)根节点至少有2个子树
(5)分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
(6)所有叶子节点都在同一层,每个节点最多有m-1个key,并且升序排列
缺点:
(1)每个节点都有key,同时也包括data,而每个页存储空间是有限的,如果data比较大的话,就会导致每个节点存储的key数量变小
(2)当存储的数据量很大的时候,会导致深度较大,增加查询时磁盘io次数,进而影响查询性能。

二、B+ Tree

B+Tree的索引结构图:
在这里插入图片描述
B+树是在B树的基础上做的一种优化,变化如下:
(1)B+树每个节点(16kb)可以包含更多的节点,这个做的原因主要有两个:第一是为了降低树的高度,第二个原因是将数据范围变为多个区间,区间越多,数据检索越快
(2)非叶子节点存储key,叶子节点存储key和数据
16kb / (8B+6B) = 1170个
(3)叶子节点两两指针相互连接(叶子节点构成双向循环链表),符合磁盘的预读性能,顺序查询性能更高

三、B- Tree

附录:

1.MySQL中两种基本索引结构Hash索引以及B+Tree索引的区别?

Hash索引的底层是Hash表,是key–value形式的键值对,允许多个key对应相同的value,但不允许一个key对应多个value。
  B+Tree索引底层是B+Tree,B+Tree是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有的记录节点都是按键值大小顺序存放(左子节点小于父节点、父节点小于右子节点)在同一层的叶节点中,叶节点间用指针相连,构成双向循环链表,非叶节点(根节点、枝节点)只存放键值,不存放实际数据。
二者的区别
(1)Hash索引是key–value键值对的形式,适合等值查询,查询单条快。
特点如下:
1.范围查询效率极低,需要进行全表扫描;
2.没办法利用索引完成排序;
3.不支持多列联合索引的最左匹配原则;(如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题)
(2)B+Tree索引是一种多路平衡查询树,所以他的节点都是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描。适合范围查询。

2.B+Tree与二叉搜索树有什么区别?

既然二叉搜索树也可以完成节点的高效增删改查,为什么又需要搞出这个多叉搜索树呢?和二叉搜索树相比,它究竟有什么得天独厚的优点呢?
B树主要用在各大存储文件系统和数据库系统当中。在这些场景下数据总量很大,我们不可能将它们都存储在内存当中。所以为了解决这个问题,我们会在树节点当中存储孩子节点的在磁盘上的地址。在需要访问的时候通过磁盘加载将孩子节点的信息读取到内存当中。也就是说在数据库当中我们遍历树的时候也伴随着磁盘读取
磁盘的随机读写是非常耗时的。显然,树的深度越大,磁盘读写的次数也就越多(暂时不是很理解),那么带来的IO开销也就越大。所以为了优化这个问题,才设计出了B树。由于B树每个节点存储的数据和孩子节点数都大于2,所以和二叉搜索树相比,它的树深要明显小得多因此读写磁盘的次数也更少,带来的IO开销也就越小。这也是它适合用在文件引擎以及数据库引擎上的原因

3.为什么二叉树及其变种不适合做索引?

(1)树的深度无法控制
(2)插入数据的性能比较低(需要旋转等)
(3)容易瘸(偏向某一边退化成链表)
(4)因为树的深度过深,而造成IO次数变多,影响数据读取的效率

4.为什么说树的深度越深,IO开销越大?

以二叉树和B+树为例,二叉树每个节点最多有两个分支(节点),但B+树是多路平衡二叉树,每个节点可以有大于两个的节点,并且每个节点上可以存放多条数据。由于二叉树节点上可能存放着数据在磁盘上的地址(当然也可以直接存放数据,往往这种情况不会在处理大数据量时出现,因为这是时候都是在内存中处理)(往往每个节点就对应着一个磁盘块),不管是查询还是其他操作,在遍历节点的时候,当树的深度越深,那节点就会越多,IO开销就越大。

还有很多内容,后续继续补充!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值