MySQL中InnoDB索引数据结构(B+树)详解

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

B+ 树: 是由二叉查找树,平衡二叉树和B树演化而来
二叉查找树: 任何节点的左节点的值都小于该节点,右节点都大于该节点。
为了避免二叉查找树的极端情况,即太高瘦,引入了平衡二叉树。
平衡二叉树: 又称 AVL 树,在满足二叉查找树特性的基础上,要求每个节点的左右子树的高度差不能超过 1。不平衡的时候会通过调整节点进行平衡,即要矮胖。

二叉查找树和平衡二叉树较为熟悉,不详细说,主要记录B树和B+树。

B树

因为数据存储在内存容易丢失,所以我们存储数据的话都是存在磁盘这种外围设备中。
但和内存相比,从磁盘中读取数据的速度会慢上百倍千倍甚至万倍,所以我们要想办法尽量减少读磁盘的次数。
另外,从磁盘中读取数据时,都是按照磁盘块来读取的,并不是一条一条的读。
那如果我们能尽量把更多的数据存放在一个磁盘块中,那么我们读取一次磁盘就可以读取更多的数据,从而减少读取磁盘的次数。
如果我们用树这种数据结构作为索引的数据结构,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块。
而平衡二叉树是每个节点只存储一个键值和数据的
那说明什么?
说明每个磁盘块仅仅存储一个键值和数据!那如果我们要存储海量的数据呢?
也就会导致二叉树的节点特别多,树的高度也特别高。
最终当我们需要查找数据的时候就要进行多次的磁盘IO查找,效率极低!

故 为了解决这种缺陷,我们就设计了一种每个节点可以存储多个键值和数据的平衡树,即B树。
mysqlb+树,数据结构,b树,数据结构,mysql,数据库
图中的每个节点称为页
页就是我们上面说的磁盘块,在 MySQL 中数据读取的基本单位都是页,所以我们这里叫做页更符合 MySQL 中索引的底层数据结构。

跟平衡二叉树相比,B树的每个节点存储了更多的键值(key)和数据(data),每个节点可以拥有更多的子结点,子结点的个数通常称为 阶,上图的B树即为 3阶B树。
注意:B树的节点包含了键值和数据两部分,每个数据在树中只出现一次。

B+树

B+ 树是对 B 树的进一步优化。
mysqlb+树,数据结构,b树,数据结构,mysql,数据库

B树和B+树的不同点

  1. B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据.
    这样的原因是在数据库中页的大小是固定的,即每个节点的大小是固定的,InnoDB 中页的默认大小是 16KB。如果不存储数据,就能在一个节点中存储更多的键值,即子节点更多(对应树的阶数也更大),树也会变得更矮更胖,我们查找数据的时候进行磁盘IO操作的次数就会更少,效率更快。
  2. B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。
    这样的话,B+ 树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。而 B 树因为数据分散在各个节点,要实现这一点是很不容易的。
    B+ 树中各个页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的
    上图中的 B+ 树索引就是 InnoDB 中 B+ 树索引真正的实现方式,准确的说应该是聚集索引。
    通过上图也可以看到,在 InnoDB 中,我们通过数据页之间通过双向链表连接以及叶子节点中数据之间通过单向链表连接的方式可以找到表中所有的数据。

聚集索引 VS 非聚集索引

什么是聚集索引呢?在 MySQL 中,B+ 树索引按照存储方式的不同分为聚集索引和非聚集索引

  1. 聚集索引(聚簇索引):以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建键,系统也会帮你创建一个隐式的主键。这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据
    这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为聚集索引。
  2. 非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别
在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键
想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。
即查找数据顺序是:先从非聚集索引找到主键->再根据主键到聚集索引找到对应的数据

总结(面试题)

MySQL的索引结构为什么是B+树?而不是其他

1.为什么不使用二叉查找树?

可能出现高高瘦瘦“一条龙”的景象,把二叉查找树退化为一个链表,相当于全表扫描,查找元素发挥不了二叉排序树的优势,只能按照链表的形式查找,高度太高了,查找效率不稳定。

2.为什么不使用平衡二叉树?

平衡二叉树解决了二叉树高度太高,查找效率不稳定的问题。但是,平衡二叉树的每个节点只存储一个键值和数据,如果数据非常的多(大多数情况下数据是海量的),二叉树的结点将会非常多,高度也会及其高,去磁盘取数据的次数就多,查找效率降低。

3.为什么不使用B树?

B树相对于平衡二叉树,优势在于每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的子结点,高度就会降低,B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,在找数据时需要遍历整个B树,为解决这个问题引出了B+树。
而且和B树相比,B+树的非叶子节点是值存储键值的,不存储数据,这样的话B+树的一个节点就可以存储更多的节点,使得树变得更加矮胖,从而查找效率更高。

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

  1. B+树的磁盘读写代价更低
    B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
  2. B+树的查询效率更加稳定
    由于非叶子结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
  3. B+树更便于遍历
    由于B+树的数据都存储在叶子结点中,非叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
  4. B+树更适合基于范围的查询
    B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

参考文章:
https://blog.csdn.net/qq_45814695/article/details/117171536
https://blog.csdn.net/qq_42410605/article/details/122517769文章来源地址https://www.toymoban.com/news/detail-608778.html

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

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

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

相关文章

  • MySQL-07.InnoDB数据存储结构

    MySQL-07.InnoDB数据存储结构

    索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的 存储引擎 负责对表中数据的读取和写入工作。不同存储引擎中 存放的格式 一般是不同的,甚至有的

    2024年04月27日
    浏览(8)
  • Mysql第二篇---InnoDB数据存储结构

    Mysql第二篇---InnoDB数据存储结构

    索引结构给我们提供了高效的索引方式, 不过索引信息以及数据记录都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 确切的说是存储在页结构中. 另一方面, 索引是在 存储引擎 中实现的, MySQL服务器上的存储引擎负责对表中数据的读取和写入工作. 不同存储引擎中存放

    2024年02月07日
    浏览(44)
  • 一文带你了解MySQL之InnoDB 数据页结构

    一文带你了解MySQL之InnoDB 数据页结构

    前言 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放

    2024年02月06日
    浏览(8)
  • MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

    MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

    前言 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念,它是Innodb管理存储空间的基本单位,页的大小默认16KB,InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放

    2024年02月05日
    浏览(8)
  • 数据结构MySQL —— 索引

    数据结构MySQL —— 索引

    目录 一、索引概述 二、索引结构 三、索引分类 四、索引语法  五、SQL性能分析 1.  查看执行频次 2.  慢查询日志 3.  show profiles指令  4.  explain执行计划 六、索引使用规则 1.  验证索引效率 2.  最左前缀法则  3.  范围查询 4.  索引失效情况 5.  SQL提示  6.  覆盖索引 7. 

    2024年01月24日
    浏览(11)
  • MySQL索引的数据结构

    MySQL索引的数据结构

    MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算法

    2024年02月14日
    浏览(9)
  • MySQL数据库索引的数据结构

    数据库索引的功能就是让查找更加的高效,所以索引的数据结构应该是能够加速查找的数据结构。 MySQL的innoDB存储引擎的索引的数据结构就是多叉搜索树中的b+树,这可以说是为索引量身定做的一个数据结构。 首先,索引可以通过主键,unique修饰创建,也可以直接使用sql语句

    2024年02月10日
    浏览(19)
  • Mysql——索引相关的数据结构

    Mysql——索引相关的数据结构

    我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学

    2024年01月16日
    浏览(12)
  • 索引的数据结构(MySql高级)

    索引的数据结构(MySql高级)

    索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章. MySQL中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合

    2024年01月18日
    浏览(8)
  • MySQL-06.索引的数据结构

    MySQL-06.索引的数据结构

    索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中的索引也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则 通过索引查找 相关数据,如果不

    2024年04月22日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包