MySQL为什么采用B+树作为索引底层数据结构?

这篇具有很好参考价值的文章主要介绍了MySQL为什么采用B+树作为索引底层数据结构?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        索引就像一本书的目录,通过索引可以快速找到我们想要找的内容。那么什么样的数据结构可以用来实现索引呢?我们可能会想到:二叉查找树,平衡搜索树,或者是B树等等一系列的数据结构,那么为什么MySQL最终选择了B+树作为索引的数据结构呢?

索引的“要求”

        要想知道什么样的数据结构最适合索引,首先我们要知道索引需要什么?

        首先,数据库的索引时保存在磁盘上的,因此我们在查询索引的时候,要先去磁盘上读取索引到内存,然后再通过索引找到要访问的数据,最后再去磁盘中读取数据,整个过程中会发生多次IO,那么我们自然希望发生磁盘IO的次数越小越好,这样可以提高数据查询的效率。

        其次,MySQL是支持范围查找的,所以我们希望通过索引可以进行高效的范围查找

二叉查找树

二叉查找树可以在logN的时间内找到目标值,那么二叉查找树适合用作索引吗?

MySQL为什么采用B+树作为索引底层数据结构?,MySQL,数据结构,mysql,b树,数据库,b+树

答案是不适合

        首先,二叉查找树存在极端情况,如果每次插入的结点都是最小或者最大的,那么二叉查找树就会退化成链表,查询的时间复杂度就从O(logN)降到了O(N)

        其次,如果索引的数量很多,树的高度也会变得很高,磁盘需要的IO次数也会不断增加。

平衡二叉树

         平衡二叉树相比于二叉查找树加上了一个条件:左右子树高度差不能超过1;虽然这个条件避免了原先二叉查找树中极端情况下会退化成链表的问题。

        但是同样的,当树中的结点不断增加的时候,树的高度高度也会不断增加,同样会使得IO次数不断增加。

B树

        实际上,二叉查找树和平衡二叉树不适合作为索引的数据结构,究其本质还是因为他们是二叉树,于是我们可以看一下m叉树的一些数据结构,比如B树。

        B树不再限制一个节点就只能有2个子节点,而是允许M个子节点 (M>2),从而降低树的高度。B树的每一个节点最多可以包括M个子节点,M称为B树的阶,所以B树就是一个多叉树

        使用了多叉树的数据结构以后,就解决了传统二叉查找树中随着索引数量的增多,IO次数会变高的问题。在实际使用中,只要M大于100,即便是千万级的数据量,仍然可以保证在3-4次IO内就找到数据。相比与传统的二叉树,多叉树会更加矮胖,更适合作为索引的数据结构。

MySQL为什么采用B+树作为索引底层数据结构?,MySQL,数据结构,mysql,b树,数据库,b+树

但是,MySQL仍然没有选择B树,为什么呢?

        首先B树的每个节点都包含数据(索引+记录),而用户的记录数据的大小很有可能远远超过了索引数据,这就需要花费更多的磁盘 I/O 操作次数来读到真正需要的索引数据信息。

        其次,MySQL是支持范围查询的,B树进行范围查询需要进行树的中序遍历,需要使用递归或者迭代搜索来进行遍历,效率不高。

B+树

最后,MySQL选择了B+树,B+树的结构大致如下所示:

MySQL为什么采用B+树作为索引底层数据结构?,MySQL,数据结构,mysql,b树,数据库,b+树

B+树和B树很相似,差异如下:

  • 叶子节点(最底部的节点)才会存放实际数据(索引+记录),非叶子节点只会存放索引

  • 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表;

 这样就解决了B树的两个缺陷。

        B+树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的B树,B+树的非叶子节点可以存放更多的索引,因此B+树可以比B树更矮胖,查询底层节点的磁盘 I/O次数会更少。

        B+树所有叶子结点使用双向链表连接,这使得其进行范围查找的时候,十分方便,相较于B树范围查询效率更高。

总结

为什么采用B+树作为索引的数据结构?

1.和传统的二叉查找树相比,B+树是一棵多叉树,树的高度更小,整个树更加矮胖,查询的效率更高;二叉树的话,数据量上去了树的高度就会很高。

(tips:实际使用中,m的值会超过100,此时即便是千万级的数据量,仍然可以保证在3-4次IO内就找到数据)

2.和B树相比文章来源地址https://www.toymoban.com/news/detail-571862.html

  • B+树的磁盘IO效率更高。B+树的数据只会存放在叶子结点(非叶子节点只存索引信息),而B树在每个节点上都要存放数据,所以在相同的空间内,B+树可以存放更多地索引信息,IO效率更高(单次IO获得的索引信息量更大)
  • B+树范围查找效率更高,B树进行范围查找需要进行树中序遍历,而B+树的叶子结点使用了双向链表连接起来,范围查找效率更高。

到了这里,关于MySQL为什么采用B+树作为索引底层数据结构?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL为什么要使用B+树做索引?MySQL索引存储模型推演,B+树在MySQL的落地形式

    user_innodb这张表里有4个字段,id,name,gender,phone。 当这张表有500万条数据,在没有索引的name字段上执行一条where查询: 如果name字段上有索引呢?我们在name字段上面创建一个索引,再来执行一下查询: 我们再来执行一下select语句。 我们会发现,有索引的查询和没有索引的

    2024年02月16日
    浏览(56)
  • MSQL系列(十二) Mysql实战-为什么索引要建立在被驱动表上

    Mysql实战-为什么索引要建立在被驱动表上 前面我们讲解了B+Tree的索引结构,也详细讲解下 left Join的底层驱动表 选择原理,那么今天我们来看看到底如何用以及如何建立索引和索引优化 开始之前我们先提一个问题, 为什么索引要建立在被驱动表上 ? 1.建表及测试数据 我们先

    2024年02月08日
    浏览(48)
  • MySQL 索引为什么使用 B+ 树,而不使用红黑树 / B 树 ?

    首先 B 树和 B+ 树 都是多叉搜索树,然后我们先来观察一下 B+ 树和 B 树的数据结构: B+ 树的数据结构实现  B 树的数据结构实现 【B+ 树相较于 B 树的优势】 1. IO 次数更少(查询效率更高)         B+ 树的非叶子节点不存放实际的数据,仅存放索引,因此数据量相同的情况

    2024年02月12日
    浏览(43)
  • MySQL索引为什么选择B+树,而不是二叉树、红黑树、B树?

    二叉树是一种二分查找树,有很好的查找性能,相当于二分查找。 二叉树的非叶子节值大于左边子节点、小于右边子节点。 原因: 但是当N比较大的时候,树的深度比较高。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能越差。 最坏的情况

    2024年04月25日
    浏览(43)
  • 现代软件为什么要采用微服架构

    现代软件采用微服务架构是为了解决传统单体架构在开发、部署和维护大型应用时面临的一系列问题。以下是采用微服务架构的主要优势: 1. **模块化和组件化**:微服务通过将应用拆分为一系列小型、松耦合的服务来提高模块化水平。每个服务都是围绕特定的业务功能构建

    2024年04月26日
    浏览(48)
  • 为什么C#要采用顶级语句?

    前言 有群友问:为什么C#要采用顶级语句? .NET6发布后,C#10莫名引入了顶级语句,这是一种简化代码结构的语言特性。在此之前,C#程序必须包含一个入口点,通常是Main方法,然后在该方法中编写主要的程序逻辑。而使用顶级语句后,可以直接在文件的顶部编写执行代码,而

    2024年02月01日
    浏览(39)
  • 为什么 OpenAI 团队采用 Python 开发他们的后端服务?

    Python,年龄可能比很多读者都要大,但是它在更新快速的编程界却一直表现出色,甚至有人把它比作是编程界的《葵花宝典》,只是Python的速成之法相较《葵花宝典》有过之而无不及。 Python简洁,高效的特点,大大提升了程序员的编码速度,极大的提高了程序员的办公效率,

    2024年02月02日
    浏览(47)
  • 炫云为什么要采用让人看不懂的GHZ计费?

    很多人看到炫云GHZ计费都表示看不懂,觉得麻烦,没有按核数、按线程或者按分钟计费简单易懂,甚至还被某些同行经常拿来攻击。哪为什么炫云还坚持用GHZ计费呢?哪是因为使用GHZ计费更加公平、透明,且具有硬件无关性。今天就来和大家详细说说炫云为什么要用GHZ计费。

    2024年02月05日
    浏览(62)
  • 入门ElasticSearch :为什么选择ES作为搜索引擎?

    随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许多优势,使得它成为许多企业和开发者的首选。 简

    2024年02月09日
    浏览(48)
  • 为什么要去了解javascript的底层?

    JavaScript的基本数据类型包括:数字、字符串、布尔值、null、undefined。其中,数字类型可以是整数或浮点数,字符串类型用单引号或双引号表示,布尔值只有true和false两个取值,null表示一个空值,undefined表示一个未定义的值。 在JavaScript底层实现中,每种数据类型都有相应的

    2024年02月01日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包