INNODB索引为什么采用B+树

B+树索引是由二叉查找树,平衡二叉树和B树三种数据结构演化而来的

二叉查找树

    二叉查找树的主要特点就是任何结点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。
    如果对于一棵分布均匀的二叉查找树来说,可以提高查询的效率,但是如果二叉查找树变成了
在这里插入图片描述
这个样子,也就是斜树的情况,其查找效率就变得很低了。而解决这个问题的方法就是使这棵树变得平衡,所以就用到了平衡二叉树了

平衡二叉树

    平衡二叉树的特点是对于每一个节点,它的左孩子和右孩子的高度差不超过1,这样就能保证树的构造是平衡的,平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体查找速度也更快。
    一般情况下,都会选择将表的数据和索引存储在磁盘这种外围设备中,但是和内存相比,从磁盘中读取数据的速度会慢上百倍千倍,所以我们应当减少从磁盘中读取数据的次数,另外,从磁盘中读取数据时,都是按照磁盘块来读取的,并不是一条一条地读,如果我们能把尽量多的数据放进磁盘块中,那么一次磁盘读取操作就会读取更多的数据,且查找数据的时间也会大幅度降低。
    如果我们使用二叉树这种数据结构作为索引的数据结构,那么每查找一次数据就需要从磁盘中读取一个节点,也就是一个磁盘块,而平衡二叉树的每个节点只存储一个键值和数据,也就是一个磁盘块只存储一个键值和数据,这样如果有海量的数据,查找数据时就会进行很多磁盘IO,查找效率就会极低。
    为了解决这个问题,就应该寻找一个单节点可以存储多个键值和数据的平衡树,那就是B树

红黑树

    红黑树是一种近似平衡二叉树,任何不平衡都会在三次旋转之内解决,节点非黑即红,无论增删改查性能都十分稳定,但是红黑树本质还是二叉树,在数据量非常大的时候,需要访问的结点数还是会比较多,数据又是存在磁盘上的,访问需要进行磁盘IO,导致效率较低。

B树

    B树的B就是balance的意思
在这里插入图片描述
这就是一棵B树,B树相对于平衡二叉树,每个节点存储了更多的键值和数据,并且每个节点拥有更多的子结点,基于这个特性,B树的查找数据读取磁盘的次数将会减少,查找效率也会比平衡二叉树高很多。但是B树的每个节点都有键和data,这无疑增大了节点的大小,虽说磁盘IO会相对于平衡二叉树少一点,但是还是没有到达最小的情况,所以这个时候就引入了B+树

B+树

在这里插入图片描述

    B+树的非叶子节点是不存储数据的,仅存储键值,如果不存储数据,那么就会存储更多的键值,也就是一次性读入内存所需要查找的关键字也就越多,减少了磁盘IO。
    B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样就可以很好提高增删效率,基于范围查找更好
    B+树的每次查询过程中,都需要从根节点遍历到叶子节点的某条路径,所有关键字的查询路径长度相同,导致每一次查询的效率相当。

B+树的分裂

这里就拿三阶B+树来说(指的是节点最多有两个关键字,三个指针)
分裂是在插入过程中出现的,先说说插入的逻辑

  • 如果节点不存在,则生成一个节点,作为B+树的根节点
  • 如果节点存在,则查找当前数值应该插入的位置,定位到需要插入到的叶子节点,然后插入到叶子节点
  • 插入的节点如果未达到最大数量,结束,如果达到最大数量,则将叶子节点对半分裂,[m/2]个放入左节点,其余的放入右结点
  • 将分裂后到右结点的第一个值提升到父结点中,若父结点元素个树未达到最大值,结束,若父结点元素个数达到最大,分裂父结点

接下来看看实现过程

  • 先插入5,B+树根节点不存在,生成根节点
    在这里插入图片描述
  • 插入根节点8,同理
    在这里插入图片描述
  • 插入节点10,
    在这里插入图片描述
    这个时候已经超过了要求,所以需要进行分裂,[3/2]=1,所以将左边一个作为左节点,右边的两个作为右结点,然后右边的第一个作为根节点
    在这里插入图片描述
  • 插入15,15应该插在右子树,插入完成之后又是超过了要求,就分裂右子树,将10上升为根节点,然后8为左节点,10 15为作为右节点
    在这里插入图片描述
    -插入20,20应该在最右边这个树上插,插好以后也是达到了要求,分裂该子树
    15上升到根节点,10作为15的左节点,10 15作为10的右结点
    在这里插入图片描述
  • 这样最上边的根节点也是超过了要求,所以也需要分裂,10作为根节点,8作为10的左孩子,10 15作为10的右孩子
    在这里插入图片描述

B树与B+树的区别

1)B树的每个结点都存储了key和data,B+树的data存储在叶子节点上。

节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。

2)树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录

由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

树高度越小,I/O次数越少。 为什么是B+树而不是B树呢,因为它内节点不存储data,这样一个节点就可以存储更多的key。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值