Mysql索引的结构——B++ Tree

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

前言

索引是Mysql中常用到的一个功能,可以大大加快查询速度,同时面试中也是经常碰到。本文是学习Mysql索引的归纳总结。

索引采用的数据结构——B+树

本部分主要是参考自小林Coding

B+树的由来

二分查找可以每次缩减一半,从而提高查找效率。

但是二分查找,若使用线性结构,每次插入,都是需要移动其余剩下的全部元素,消耗巨大。

因此有了二分查找树。

但是二叉树若每次插入的都比其父节点大,则会演变为链表,从而使查询复杂度从 O(logn)降低为 O(n)。

因此有了自平衡二叉树,诸如AVL树或红黑树,其都是这样的自平衡二叉树。

但由于其本质还是一棵二叉树,所以会随着数据量增大,导致层数增加, IO操作增多(每一层IO多一次)。

因此有了B树。其每个节点允许有M个子节点,M是B树的阶,假设M为3,那就是阶为3的B树,其每个节点最多有2(M-1)个数据和3(M)个子节点。若超过,则分裂节点。

Mysql索引的结构——B++ Tree,基础组件学习,# Mysql,mysql,数据库

但是 B 树的每个节点都包含数据(索引+记录),每次IO都会需要查询到节点上记录的内容。若数据量大于索引的大小,那么在读取底层节点索引的时候,就会导致较多的IO操作。从而使性能受到巨大影响。

因此有了B+ 树,B+树和B树的结构其实相似,只是仅将数据存储在底层叶子节点。其余的子节点仅存储索引。从而解决了数据大、影响IO的问题。
其次,其底层叶子节点之间,既存了索引也存了记录。叶子节点之间通过链表连接起来。从而对于范围查询,可以大大提升效率。

B+树的结构

关于B++树的结构看图就好了。
Mysql索引的结构——B++ Tree,基础组件学习,# Mysql,mysql,数据库

Mysql索引的结构——B++ Tree,基础组件学习,# Mysql,mysql,数据库

B+树的叶子节点是单链表还是双向链表

网上很多探讨针对于“其叶子节点是单向链表还是双向链表”,包括小林也是做出了一次纠正。
在此文发现了一些结论与有趣的探讨。

Mysql索引的结构——B++ Tree,基础组件学习,# Mysql,mysql,数据库

顺着此,找到了一个结论——B+ 树中各个页之间是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的。

Mysql索引的结构——B++ Tree,基础组件学习,# Mysql,mysql,数据库

为什么选用了B+ 树

这里直接复制小林的结论了。

B+ 树 vs B 树

B+Tree 只在叶子节点存储数据,而 B 树 的非叶子节点也要存储数据,所以 B+Tree 的单个节点的数据量更小,在相同的磁盘 I/O 次数下,就能查询更多的节点。

另外,B+Tree 叶子节点采用的是双链表连接,适合 MySQL 中常见的基于范围的顺序查找,而 B 树无法做到这一点。

B+ 树 vs 二叉树

对于有 N 个叶子节点的 B+Tree,其搜索复杂度为O(logdN),其中 d 表示节点允许的最大子节点个数为 d 个。

在实际的应用当中, d 值是大于100的,这样就保证了,即使数据达到千万级别时,B+Tree 的高度依然维持在 3~4 层左右,也就是说一次数据查询操作只需要做 3~4 次的磁盘 I/O 操作就能查询到目标数据。

而二叉树的每个父节点的儿子节点个数只能是 2 个,意味着其搜索复杂度为 O(logN),这已经比 B+Tree 高出不少,因此二叉树检索到目标数据所经历的磁盘 I/O 次数要更多。

B+ 树 vs Hash

Hash 在做等值查询的时候效率贼快,搜索复杂度为 O(1)。

但是 Hash 表不适合做范围查询,它更适合做等值的查询,这也是 B+Tree 索引要比 Hash 表索引有着更广泛的适用场景的原因。文章来源地址https://www.toymoban.com/news/detail-824599.html

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

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

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

相关文章

  • Mysql索引(2):索引结构

    1 概述 MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种: 索引结构 描述 B+Tree索 最常见的索引类型,大部分引擎都支持 B+ 树索引 Hash索引 底层数据结构是用哈希表实现的, 只有精确匹配索引列的查询才有效, 不支持范围查询 R-tree(空间

    2024年02月03日
    浏览(43)
  • ⑩② 【MySQL索引】详解MySQL`索引`:结构、分类、性能分析、设计及使用规则。

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 索引 : 什么是索引(index) ? 索引(index)是帮助MySQL 高效获取数据的数据结构 (有序):在数据之外,数据库系统

    2024年02月05日
    浏览(50)
  • MySQL之索引结构

    索引是帮助MySQL 高效获取数据 的 数据结构 (有序)。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 下图演示有索引和无索引的区别

    2024年01月22日
    浏览(30)
  • MySQL存储结构及索引

    1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可

    2024年02月13日
    浏览(52)
  • MySQL 索引结构浅析

    上面是二叉树和红黑树的结构,其实 红黑树是一个自平衡二叉查找树 ,可以用于解决二叉树顺序插入时形成一个有序链表问题。 但是两者都有一个明显缺点,就是 当数据量过大时,层级较深,检索速度慢。 下面分析一下 B树( 多路 平衡查找树) 名词解析: 度数:指的是

    2024年02月14日
    浏览(34)
  • MySQL索引的底层结构

    本质是一种‘排好序的数据结构’,可以帮助快速查找数据。可以类比目录理解。 虽然它查询使用优化隐藏器提高性能,但是也会相应占物理空间,从而导致降低增删改的速度,因为操作数据的同时也要‘维护索引文件’。 常规的搜索引擎一般都是采用B树或者B+树来实现索

    2023年04月22日
    浏览(27)
  • 数据结构MySQL —— 索引

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

    2024年01月24日
    浏览(48)
  • Mysql B+数索引结构

    3.1 页分裂过程实例 3.1.1 原有数据1、3、5形成如下数据页 3.1.2 先新插入数据4,因为 页10 最多只能放3条记录所以我们不得不再分配一个新页: 新分配的 数据页编号 可能并 不是连续的 ,也就是说我们使用的这些页在 存储空间里可能并不挨着 。它们只是通过维护着上一个页和

    2024年02月10日
    浏览(25)
  • MySQL索引的数据结构

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

    2024年02月14日
    浏览(41)
  • MySQL索引:结构、语法、分类和优化

    MySQL索引是数据库中非常关键的性能优化手段。它们提供了快速访问数据的方法,同时也可以极大地提高查询效率。本文将深入介绍MySQL索引的结构、语法、分类,以及如何使用 Profile 和 EXPLAIN 来优化查询性能,带有详细的实例演示。 索引结构 MySQL索引基于B-Tree结构实现。这

    2024年02月07日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包