您现在的位置是:群英 > 数据库 > MySQL数据库
MySQL索引用B+树结构的优势在哪?
Admin发表于 2021-12-24 18:02:571317 次浏览

    这篇文章我们来了解一下MySQL索引结构的相关内容,我们知道MySQL索引采用的是B+树结构,那么究竟为何采用B+树结构呢?用B+树结构的优势在哪?感兴趣的朋友接下来就跟随小编来一起学习一下吧!

    索引提高查询效率,就像我们看的书,想要直接翻到某一章,是不是不用一页一页的翻,只需要看下目录,根据目录找到其所在的页数即可。

    在计算机中我们需要一种数据结构来存储这个目录,常见数据结构有哈希表,二叉查找树,二叉平衡树(AVL),红黑树,那为什么Innodb和MyISAM选择b+树呢。

    1. 哈希表

哈希表就是一个数组+链表,用下标0,1,2,3..... 表示其数据所在的位置。如果想要在哈希表中存放数据,首先用对这个数据进行散列算法(基本的就是取模运算),假如数组长度是13 ,进行模13之后是0-12,正好对应的数据的下标,如果计算出的下标一样的,就会在下标位置跟上链表。

    缺点:

  1. 利用hash存储需要将所有的数据文件添加到内存,比较消耗内存空间。
  2. hash的查找是等值查询,速度很快,但是各个数据间没有范围规律,但在实际工作中更多的是范围查询,hash就不太合适了。

    不能直接说mysql不使用哈希表,而是要根据存储引擎来确定的,Memory存储引擎使用的就是哈希表

    2. 二叉查找树

    缺点:

  1. 如图,极端情况可能会出现倾斜的问题,最后变成链表结构。
  2. 造成树节点过深,从而增加查找的IO,而现在IO就是查找的瓶颈
    3. 二叉平衡树-AVL

为了保持树的平衡,避免出现数据倾斜,需要进行旋转操作,通过左旋或者右旋最终保持最长子树和最短子树长度不能超过1,如果超过1就不是严格意义上AVL树了

    缺点:

    1.当数据量很大的时候,为了保持平衡,需要进行1-n次的旋转,这个旋转是比较浪费性能的,插入和删除效率极低,查询效率很高。

  1. 只有两个分支,数据量大的时候树的深度依然很深。
    4. 红黑树

最长子树的不能超过最短子树的2倍,通过变色和旋转,在插入和查询上做了平衡

红黑树是avl树的变种,损失了部分查询性能来提高插入性能。

    缺点:

    同样是只有两个分支,数据量大的时候深度依然会很深

    以上三种二叉树,随着数据的增多,最终都会出现节点过多的情况,而且他们有且仅有2个分支,那么IO的次数一样很多.

    怎么解决仅有2个分支而且深度过深,这就有了B树,增加分支

    5. B-Tree
  1. 首先不读B减树,读B树
  2. 所有键值分布在整棵树中。
  3. 搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找。
  4. 每个结点最多拥有m个子树。
  5. 根节点至少有2个子树。
  6. 分支节点至少拥有m/2棵子树(除根节点和叶子节点外都是分支节点)。
  7. 所有叶子节点都在同一层,每个节点最多可以有m-1个key,并且以升序排列

    如上图:(图中只是画出来一部分,实际上没有限制的,不止p1,p2,p3)

    每个节点占用一个磁盘块,一个节点上有两个升序排列的关键字和三个指向子树根节点的指针,指针存储的是子节点所在的磁盘块地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为16和34,p1指针指向的子树的数据范围小于16,p2指针指向的子树的数据范围为16-34,p3指针指向的子树的数据范围大于34。

    查找关键字28的过程:

  1. 根据根节点找到磁盘块1,读到内存中。【第一次磁盘I/O操作】
  2. 比较关键字28在区间(16,34),找到磁盘块1的指针p2。
  3. 根据p2指针找到磁盘块3,读到内存。【第二次磁盘I/O操作】
  4. 比较关键字28在区间(25,31),找到磁盘块3的指针p2。
  5. 根据指针p2找到磁盘块8,读到内存。【第三次磁盘I/O操作】
  6. 在磁盘块8中的关键字列表中找到关键字28,结束。

    缺点:

  1. 每个节点都有key,同时包含data,而每个页存储空间是有限的,如果data很大的话会导致每个节点能存储的key的数量变小。
  2. 当存储的数据量很大的时候会导致深度变大,增加查询磁盘的io次数,进而影响查询性能。
    6. B+树

B+树是在B树的基础上做的一种优化,变化如下:

  1. B+树每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变成多个区间,区间越多,数据检索越快。
  2. 非叶子节点只存储key,叶子节点存储key和数据。
  3. 叶子节点两两指针互相连接(符合磁盘预读的特性),顺序查询性能更高。

    如上图: 在B+树上有两个头指针,一个指向根节点,另一个指向关键字的最小叶子节点,而且所有叶子节点(及数据节点)之间是一种链式环结构,因此可以对B+树进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始的随机查找。

    InnoDB和MyISAM中索引上的差异

    1. InnoDB-主键索引

    叶子节点存储的是具体的行数据

    2. InnoDB-非主键索引

    非主键索引的叶子节点存储的是主键值(所以查询数据基本要回表)

    3. MyISAM

    叶子节点存储的是行数据的地址,额外需要一次寻址,多一次IO

    总结:为什么mysql使用的是B+树

准确的表述:为什么mysql的InnoDB和MyISAM存储引擎的索引使用的是B+树

  • hash表,等值查询是很快的,但是不满足常用的范围查找且相邻的两个值之间没有关系,而且hash比较消耗内存。

  • 二叉树/平衡二叉树/红黑树等都是有且仅有2个分支,共性就是数据量大的时候树的深度变深,增加IO的次数。

  • B树会在节点上存储数据,这样一页存放的key的数量就会减少,增加树的深度。

  • B+树中非叶子节点去除了数据,这样就会增加一页中key的数量,而且叶子节点之间是通过链表相连,有利于范围查找和分页。


    原文地址:https://juejin.cn/post/6994810803643744269

    作者:纪先生

    现在大家对于MySQL索引用B+树结构的原因和优势这些应该都了解了吧,需要的朋友了解看看这些篇,希望大家阅读完这篇文章能有所收获。最后,想要了解更多MySQL索引的内容,大家可以关注群英网络其它相关文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: mysql索引
相关信息推荐
2022-05-07 17:50:31 
摘要:关闭触发器的方法:1、使用“ALTER TRIGGER 触发器名称 DISABLE;”语句,可关闭指定名称的触发器;2、使用“ALTER TABLE 表名称 DISABLE ALL TRIGGERS;”语句,可关闭指定数据表中的所有触发器。
2022-08-08 17:32:18 
摘要:解决方法:1、在服务面板中启动“OracleOraDb11g_home1TNSlistener”服务;2、启动OracleServiceBOOKSALES服务;3、用regedit将“ORACLE_SID”设置为database SID。
2022-08-06 17:55:38 
摘要:RAC是real application clusters的缩写,译为“实时应用集群”, 是Oracle新版数据库中采用的一项新技术,是高可用性的一种,也是Oracle数据库支持网格计算环境的核心技术。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部