返回顶部
首页 > 资讯 > 数据库 >MySQL底层数据结构选用B+树的原因
  • 328
分享到

MySQL底层数据结构选用B+树的原因

2024-04-02 19:04:59 328人浏览 泡泡鱼
摘要

       我们都知道Mysql底层数据结构是选用的B+树,那为什么不用红黑树,或者其他什么数据结构呢?         红黑树是一种自平衡二叉查找树,Java8中的HashMap

       我们都知道Mysql底层数据结构是选用的B+树,那为什么不用红黑树,或者其他什么数据结构呢?

        红黑树是一种自平衡二叉查找树,Java8中的HashMap就用到红黑树来优化它的查询效率,可见,红黑树的查询效率还是比较高的,但是为什么mysql的底层不用红黑树而用B+数呢?

        下图是红黑树依次插入1,2,3,4,5,6之后的情况:

 然后再在上面的红黑树中插入7:

       可以看到,尽管红黑树经过了自平衡,数据整体仍然偏向树的右侧,如果继续添加更多数据,添加的数据上百万、千万之后,树的层级将会非常高,查询时每多经过一层,就会多进行一次io,树的层级多了之后查找效率就会很慢。这个时候可能就会有人问了,那为什么不用平衡性更好的AVL树呢?

        AVL树在一次插入1,2,3,4,5,6,7之后是这样的:

         的确变顺眼了很多,树的层数也变少了,可AVL仍然没有解决根本问题,当数据量达到百万、千万之后,树的层数仍然会比较大,先不说AVL树维护平衡所需的代价,单论AVL树的层数就无法达到我们的要求。

        那么什么样的数据结构可以让数据量达到百万,千万,甚至更大的体量时,层数仍然很小呢?很显然,想要减少层数,就必须要让每层储存的数据数更多,二叉树不管平衡性再好也只能做到每个节点有两个分叉,每层的数据量从数据结构被限制住了,那么,我们就不能从二叉树中选。所以这个时候B树的优势就体现出来了,B树每个节点可以存储多个元素,每个元素之间可以都可以拥有一个分叉,下图是B树每个节点最多可以存储3个元素的情况:

         可以看到树的层级减小到两层,如果说每次每个节点最多可以存储的元素个数足够大,那么就算数据量达到上千万的量级,也可以将树的层级控制在一个可以接受的范围内。

        但B树还有一个问题,下图展示的是B树层级达到三层时的情况:

         如果现在我需要取出5-10号元素,当我通过层层查询,找到5号元素,然后发现其他元素不在这个节点,还需要通过局部中序遍历查询其他元素,找到7之后还需如此操作找到8,9,10,这又会增加io次数,所以也就有了B+树。

        B+树是对B树的优化,主要是从两个地方进行优化的:

        第一个优化是在每个叶子节点之间加上了一个双向指针,指向相邻节点,这样就解决了刚才的范围查询问题,范围查询如果跨了多个节点,就可以通过这个双向指针快速找到相邻节点,而不需要通过局部的中序遍历,从而减少了io次数。下图演示的是B+树:

       但如果要找的元素不在叶子节点上呢?别担心,B+树的另一个优化就是的叶子节点包含了这颗树的所有元素!B+树的非叶子节点不再保存元素的data数据或者指针了,只是作为冗余的索引构成完整的B+树来方便查询。可以看到上图的15号元素不仅仅存在于非叶子节点中,也存在于叶子节点中。这样的设计虽然带来了很多冗余的索引,但是却让范围查询时不再需要向上查找非叶子节点了,而且每一层可以保存的索引数量变多了,让数据库每次io可以查询到更多的索引元素,毕竟在正常情况下,数据占的空间比索引占的空间要大很多。(需要注意的是,InnoDB和MyISAM引擎虽然都是用的B+树,但InnoDB的聚簇索引和数据是保存在一起的,而MyISAM是将聚簇索引和相应数据的指针保存在一起的,索引和数据是分开的。MyISAM引擎下的B+树也只有叶子节点才保存数据的指针)

        由上面的分析我们可以知道,选用B+树作为Mysql的底层是为了减少io次数,那我们为什么不直接极端一点,使用hash来保存数据或者索引呢?其实MySQL确实支持hash类型的索引。

        但是hash索引一般都不用,主要是因为hash索引的储存的是hash码,储存的顺序与索引列的值大小无关,所以只有在进行精确查找时hash索引才能生效,范围查询时会进行全表扫描。同时,如果表中的数据量非常大的话,发生hash碰撞的次数会增多,单个查找的效率不一定比B+树高。

        简单总结一下,B+树相比其他树来说,每个节点可以存储更多元素,可以大大减少查询时需要的io次数,非叶子节点不存储数据或指针的设计可以提高每个节点存储元素的数量,叶子节点具有的双向指针可以提高范围查询的效率。

到此这篇关于MySQL底层数据结构选用B+树的原因的文章就介绍到这了,更多相关MySQL B+树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL底层数据结构选用B+树的原因

本文链接: https://lsjlt.com/news/159945.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL底层数据结构选用B+树的原因
           我们都知道MySQL底层数据结构是选用的B+树,那为什么不用红黑树,或者其他什么数据结构呢?         红黑树是一种自平衡二叉查找树,Java8中的hashmap...
    99+
    2024-04-02
  • mysql索引数据结构要用B+树的原因是什么
    这篇文章主要讲解了“mysql索引数据结构要用B+树的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql索引数据结构要用B+树的原因是什么”吧!1. Hash表?No因考虑到...
    99+
    2023-06-30
  • MySQL使用B+树作为索引结构的原因
    这篇文章将为大家详细讲解有关MySQL使用B+树作为索引结构的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、二叉查找树(BST):不平衡二叉查找树(BST,Bin...
    99+
    2024-04-02
  • mysql底层数据结构
    mysql索引是为了快速查找数据而把数据按照一定规则排列的数据结构 查看数据结构地址:Data Structure Visualization 一、索引数据结构分类 1、无索引查找 普通的查找就是通过全表扫描,数据存储在磁盘上的位置是随机的...
    99+
    2023-09-05
    数据库
  • mysql索引采用B+树结构的原因有哪些
    这篇文章将为大家详细讲解有关mysql索引采用B+树结构的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。索引提高查询效率,就像我们看的书,想要直接翻到某一章,是...
    99+
    2024-04-02
  • 树结构中MongoDb使用的到底是 B 树还是B+树
    这篇文章给大家介绍树结构中MongoDb使用的到底是 B 树还是B+树,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。关于 B 树与 B+ 树,网上有一个比较经典的问题:为什么 Mong...
    99+
    2024-04-02
  • MySQL索引的数据结构-B+树介绍
    1.聚集索引和辅助索引 在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着查询时间只需要0.02~0.0...
    99+
    2017-02-08
    MySQL索引的数据结构-B+树介绍
  • MySQL数据库索引选择使用B+树的原因是什么
    这篇文章主要介绍MySQL数据库索引选择使用B+树的原因是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、二叉查找树(1)二叉树简介:二叉查找树也称为有序二叉查找树,满足二叉查...
    99+
    2024-04-02
  • MySQL用B+树(而不是B树)做索引的原因
      https://www.jianshu.com/p/7ce804f97967 众所周知,MySQL的索引使用了B+树的数据结构。那么为什么不用B树呢? 先看一下B树和B+树的区别。 1.B树 维基百科对B树的定义为“在计算...
    99+
    2020-03-03
    MySQL用B+树(而不是B树)做索引的原因
  • Redis数据结构SortedSet的底层原理解析
    目录概述一些常用命令实现跳跃表跳表的插入压缩列表概述 一些常用命令 存储:zadd key score value获取:zrange key start end获取:同时获取分数:zrange key start end...
    99+
    2022-07-13
    Redis数据结构底层原理 SortedSet底层原理 Redis数据结构SortedSet
  • MySQL中InnoDB索引数据结构(B+树)详解
    mysql的innodb的索引的B+树逐步讲解 B树B+树B树和B+树的不同点聚集索引 VS 非聚集索引总结(面试题)1.为什么不使用二叉查找树?2.为什么不使用平衡二叉树?3.为什么不使用B树?4.为什么MySQL选择B+树做索引...
    99+
    2023-08-17
    b树 数据结构 mysql 数据库
  • MySQL索引底层数据结构详情
    目录一、索引类型 1.B+树 2.MyISAM和InnoDB的B+树索引实现方式的区别(聚簇索引和非聚簇索引)?3.非聚簇索引 4.聚簇索引的优缺点5.哈希索引 6.自适应哈希索引 ...
    99+
    2024-04-02
  • MySQL使用B树的原因有哪些
    这篇文章主要介绍MySQL使用B树的原因有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁...
    99+
    2024-04-02
  • MySQL索引底层数据结构是什么
    本篇文章为大家展示了MySQL索引底层数据结构是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  案例:  CREATE TABLE `employees` (...
    99+
    2024-04-02
  • Redis的六种底层数据结构(小结)
    目录1、简单动态字符串(SDS)2、链表3、字典哈希表哈希表节点字典4、跳跃表跳跃表节点(zskiplistNode)跳跃表(zskiplist)5、整数集合6、压缩列表1、简单动态...
    99+
    2024-04-02
  • java中hashmap的底层数据结构与实现原理
    目录Hash结构HashMap实现原理为何HashMap的数组长度一定是2的次幂?重写equals方法需同时重写hashCode方法总结Hash结构 HashMap根据名称可知,其实...
    99+
    2024-04-02
  • Go反射底层原理及数据结构解析
    目录1. 反射的引入与介绍2. 反射的数据结构3. 如何通过反射对象来修改原数据对象的值?1. 反射的引入与介绍 在计算机科学中,反射是指计算机程序在运行时(Run time)可以访...
    99+
    2024-04-02
  • MySQL索引底层数据结构怎么理解
    这篇文章主要介绍“MySQL索引底层数据结构怎么理解”,在日常操作中,相信很多人在MySQL索引底层数据结构怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL索引底层数据结构怎么理解”的疑惑有所...
    99+
    2023-06-25
  • 一文了解mysql索引的数据结构为什么要用B+树
    目录1. Hash表?No2. 二叉查找树(BST)?No3. 红黑树?No4. 平衡二叉树(AVL)?差那么二点意思5. B-tree(B-树也称B树)?差那么一点意思6. B+树...
    99+
    2024-04-02
  • Redis的底层数据结构有多少种
    小编给大家分享一下Redis的底层数据结构有多少种,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、简单动态字符串(SDS)Redis 虽然是用 C 语言写的,但Redis没有直接使用C语言传统的字符串表示(以空字符 &a...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作