mysql使用b+树的原因_b+树索引和hash索引

mysql使用b+树的原因_b+树索引和hash索引https://www.jianshu.com/p/7ce804f97967 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 1.B树 维基百科

MySQL用B+树(而不是B树)做索引的原因

 

https://www.jianshu.com/p/7ce804f97967

众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢?
先看一下B树和B+树的区别。

1.B树

维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。”

B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。

1.1定义

  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 其它节点至少有M/2个子节点
    下图是一个M=4 阶的B树:

     
    mysql使用b+树的原因_b+树索引和hash索引

    M=4的B树

    可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。

B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画:

 
mysql使用b+树的原因_b+树索引和hash索引

btreebuild

2.B+树

B+树是对B树的一种变形树,它与B树的差异在于:

  • 有k个子结点的结点必然有k个关键码。
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
    如下图是一个B+树:

     
    mysql使用b+树的原因_b+树索引和hash索引

    M=4的B+树

    下图是B+树的建立过程:

     
    mysql使用b+树的原因_b+树索引和hash索引

    Bplustreebuild.gif

B+树和B树的区别

B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
B+ 树的优点在于:

  • IO次数更少:由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • 遍历更加方便:B+树的叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。下面是B 树和B+树的区别图:

 
mysql使用b+树的原因_b+树索引和hash索引

B树和B+树的区别图

为什么MySQL选择B+树做索引

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3、B+树更便于遍历:由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

4、B+树更适合基于范围的查询:B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

参考

作者:Jarkata

链接:https://www.jianshu.com/p/7ce804f97967

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8800.html

(0)
上一篇 2023-02-21
下一篇 2023-02-21

相关推荐

  • 如何安装Numpy库

    如何安装Numpy库strongNumpy库/strong是Python语言的一种基础库,是用于数值计算的库,在Python中广泛应用于科学计算、数据处理、机器学习等领域。

    2024-04-23
    22
  • mysql使用技巧_MySQL常用命令

    mysql使用技巧_MySQL常用命令上篇文章介绍了如何创建合适的MySQL索引,今天再一块学一下如何更规范、更合理的使用MySQL?
    合理规范的使用MySQL,可以大大减少开发工作量和线上问题,并提升SQL查询性能。
    我精心总结了这16

    2023-05-29
    96
  • 上海哪里有开住宿费发票

    上海哪里有开住宿费发票电13564998196 陈生详情-项.目.齐.全 可先开验。-本报讯(劳动报记者陆燕婷)聚焦餐饮行业,58同城招聘研究院昨 发布数据显示,今年上半年,全国餐饮行业招聘需求增长46.18%,平均月薪…

    2023-02-15
    102
  • 开源自动化运维平台_运维之路

    开源自动化运维平台_运维之路原文链接:三分钟走进袋鼠云一站式全自动化全生命周期运维管家ChengYing(承影) 课件获取:关注公众号 ** “数栈研习社”,后台私信 “ChengYing”** 获得直播课件 视频回放:点击这里

    2023-05-25
    104
  • 数据库作业在哪里存着_mysql数据库大作业

    数据库作业在哪里存着_mysql数据库大作业题目如下: 1.查询sC表中的全部数据。2. 查询计算机系学生的姓名和年龄3.查询成绩在70~80分的学生的学号、课程号和成绩4.查询计算机系年龄在18~20岁的男生姓名和年龄s.查询C001课程的最

    2023-02-15
    110
  • 一次非常有意思的 SQL 优化经历:从 30248.271s 到 0.001s[亲测有效]

    一次非常有意思的 SQL 优化经历:从 30248.271s 到 0.001s[亲测有效]场景 索引优化 单列索引 多列索引 索引覆盖 排序 参考文章 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIM…

    2023-03-18
    104
  • [转] Oracle sql语句执行顺序「终于解决」

    [转] Oracle sql语句执行顺序「终于解决」sql语法的分析是从右到左 一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限…

    2023-03-31
    112
  • 函数组合什么时候出道的_接口函数

    函数组合什么时候出道的_接口函数函数组合在函数式编程中被称为组合(composition),我们将了解组合的概念并学习大量的例子。然后创建自己的compose函数。 组合的概念是非常直观的,并不是函数式编程独有的,在我们生活中或者前端开发中处处可见。 比如我们现在流行的 SPA (单页面应用),都会有组件的概…

    2023-03-02
    103

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注