B树和B+树的理解

二叉树、AVL树、B树的概念

B树是一种多路平衡查找树,为了更加形象去理解树的概念,先来看下二叉树
二叉树
二叉树是指每个节点最得意支持两个分叉,想比与单向链表来说它多了一个分支,而二叉查找树是在二叉树的基础上去增加一个规则,它的规则是左子树的所有子节点都要小于它的根节点,而右子树的所有子节点都要大于它的根节点
斜树和平衡二叉树
二叉查找树有可能会出现斜树的问题,导致时间复杂度会增加,因此引入一个叫平衡二叉树的一个机制,它具有二叉查找树的所有特点,同时增加了一个规则,左右两个子树的高度差的绝对值不能超过1,平衡二叉树为了达到这样一个平衡,所以它会引入一个这样左旋和右旋的机制去实现树的平衡
B树
而B树它是一种多路平衡查找树,它满足平衡二叉树的规则,同时它也可以有多个子树,子树的数量呢取决于它的关键字数量,如图,根结点有两个关键字3和5,那么它能够拥有的子路数量等于关键字的数量加上1,因此从这个特征来看,在存储同样数据量的情况下,平衡二叉树它的高度一定大于B树的高度,而所为的B+树是在B树的基础上做了增强,最大区别有两个点

  1. B树的数据存储在每个节点上,而B+树的数据是存储在叶子节点上,并且通过链表的方式把叶子节点的所有数据进行一个链接
  2. B+树的子路数量等于关键字的数量
    B树
    如图这是一个B树,从B树的结构上可以看到每个节点都会存储数据
    B+树
    如图,这是一个B+树的结构,B+树的所有数据是存储在叶子节点上的,并且叶子节点的数据是用双向链表来关联,这是属于InnoDB里面一个特征
B树和B+树的应用场景

B树和B+树一般应用在文件系统和数据系统中,用来减少磁盘IO所带来的性能损耗的一个机制的,以Mysql中的InnoDB为例,当我们通过select语句去查询一条数据的时候,InnoDB需要取磁盘读取数据,而这个过程会涉及到磁盘IO以及磁盘的随机IO
磁盘读取
如图,我们知道磁盘IO的性能是特别低的,特别是随机磁盘的IO,为了更好的去理解为什么性能低,我们来看下磁盘IO的工作原理,首先系统会把数据的逻辑地址传给磁盘,磁盘控制线路按照寻址的逻辑把逻辑地址翻译成物理地址,也就是确定要读取的数据在哪个磁道,哪个扇区,为了读取这个扇区的数据,需要把磁头放在扇区上面,为了实现这样一个点,磁盘会不断的去旋转,把目标的扇区旋转到磁头下面,使得磁头能够去找到对应的磁道,这里会涉及到寻道的时间,以及旋转时间的损耗,很明显磁盘IO这个过程的性能开销是非常大的,特别是查询的数据量比较多的情况下,所以在InnoDB里面,对存储在磁盘上的数据建立一个索引,然后把索引数据,以及索引所对应的磁盘地址以B+树的方式进行存储
B+树3
当我们需要查找目标数据的时候,根据索引从B+树中去查找目标数据就行了,由于B+树子路比较多,所以只需要较少次数的1磁盘IO就能够查到目标数据,

为什么用B树或B+树来做索引结构

因为AVL树的高度要比B树或者B+树的高度更高,而高度就意味着磁盘IO的数量,所以为了减少磁盘IO的次数,所以文件系统或者数据库才会使用B树,或者B+树来做索引结构

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我黄同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值