MySQL:MySQL索引结构为什么选用B+树?

一、前言

  当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构。我们知道树的分类有很多,MySQL中使用了B+树作索引结构,这是为什么呢?

  本文将从树的介绍,二叉查找树(BST)、平衡二叉树(AVL)、红黑树、B树和B+树区别以及优缺点分析原因。

二、树的简介

1. 简介
  树跟数组、链表、堆栈一样,是一种数据结构。它由有限个节点,组成具有层次关系的集合。因为它看起来像一棵树,所以得其名。

如图所示,一颗简单的树结构:
在这里插入图片描述

2. 树的分类

在这里插入图片描述

无序树:树中任意节点的子结点之间没有顺序关系有序树:树中任意节点的子结点之间有顺序关系

3. 树的常见概念:

  1. 结点的度:一个结点含有的子结点个数称为该结点的度;

  2. 树的度:一棵树中,最大结点的度称为树的度;

  3. 父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;

  4. 深度:对于任意结点n,n的深度为从根到n的唯一路径长,根结点的深度为0;

  5. 高度:对于任意结点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

三、二叉查找树(BST)、平衡二叉树(AVL)、红黑树、B树和B+树详解

1. 二叉查找树(BST)
  二叉查找树是一种特殊的二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。二叉查找树中不存在重复的值。

在这里插入图片描述

优点:
  可以快速地进行查找、插入和删除操作。在平均情况下,这些操作的时间复杂度为O(log n)。

缺点:
  可能会出现不平衡的情况,导致树的高度过高,影响效率。在最坏情况下,这些操作的时间复杂度会退化为O(n)。

2. 平衡二叉树(AVL)
  平衡二叉树是一种特殊的二叉查找树,它通过保持树的平衡性来确保查找、插入和删除操作的时间复杂度在最坏情况下仍然为O(log n)。在AVL树中,任何节点的两个子树的高度最大差别为1。

在这里插入图片描述

优点:
  ①. 在最坏情况下仍然保持高效的查找、插入和删除操作。
  ②. 非常适合动态数据集合,因为它们可以在保持平衡的同时允许数据的插入和删除。

缺点:
  ①. 实现复杂度较高,特别是涉及到旋转操作来保持树的平衡。
  ②. 每个节点需要额外的存储空间来维护平衡信息,如在AVL树中存储每个节点的高度。

3. 红黑树
  红黑树是一种自平衡的二叉查找树,它通过颜色和节点高度的限制来保持树的相对平衡。红黑树中的每个节点都有一个颜色属性,可以是红色或黑色。

在这里插入图片描述

优点:
  ①. 以O(log n)的时间复杂度进行搜索、插入、删除操作。
  ②. 由于它的设计,任何不平衡都会在三次旋转之内解决。

缺点:
  ①. 实现比普通二叉搜索树复杂。
  ②. 每个节点需要额外的存储空间来维护颜色信息。

4. B树
  B树是一种自平衡的搜索树,常用于存储大量的关键字和数据。B树的每个节点可以拥有多个子节点,通常采用二分查找的方式进行搜索。

在这里插入图片描述

优点:
  ①. 节点包含关键字信息,适合范围查询。
  ②. 节点大小适中,适合磁盘存储。

缺点:
  ①. 插入和删除操作需要频繁的节点分裂和合并,性能较低。
  ②. 非叶子节点的关键字信息冗余,降低了存储效率。

5. B+树
  B+树是在B树的基础上进行了优化,所有关键字都在叶子节点上,非叶子节点只包含子节点的信息。叶子节点之间通过指针连接,形成有序链表。

在这里插入图片描述

优点:
  ①. 查找性能更稳定,适用于范围查询。
  ②. 磁盘读写代价更低,更适合作为数据库和文件系统的索引结构。

缺点:
  ①. 插入和删除操作也可能需要频繁的节点分裂和合并。
  ②. 实现相对复杂。

四、B+树能够存储的大概数据量

  对于Innodb的B+索引来说,树的高度一般在2-4层。树的高度是由阶数决定的,阶数越大树越矮;而阶数的大小又取决于每个节点可以存储多少条记录。Innodb中每个节点使用一个页(page),页的大小为16KB,其中元数据只占大约128字节左右(包括文件管理头信息、页面头信息等等),大多数空间都用来存储数据。

  对于非叶节点,记录只包含索引的键和指向下一层节点的指针。假设每个非叶节点页面存储1000条记录,则每条记录大约占用16字节;当索引是整型或较短的字符串时,这个假设是合理的。延伸一下,我们经常听到建议说索引列长度不应过大,原因就在这里:索引列太长,每个节点包含的记录数太少,会导致树太高,索引的效果会大打折扣,而且索引还会浪费更多的空间。

  对于叶节点,记录包含了索引的键和值(值可能是行的主键、一行完整数据等,具体见前文),数据量更大。这里假设每个叶节点页面存储100条记录(实际上,当索引为聚簇索引时,这个数字可能不足100;当索引为辅助索引时,这个数字可能远大于100;可以根据实际情况进行估算)。

  对于一颗3层B+树,第一层(根节点)有1个页面,可以存储1000条记录;第二层有1000个页面,可以存储10001000条记录;第三层(叶节点)有10001000个页面,每个页面可以存储100条记录,因此可以存储10001000100条记录,即1亿条。而对于二叉树,存储1亿条记录则需要26层左右。

五、总结

MySQL选择B+树作为其索引数据结构,主要有如下一些原因:

1.性能高效:
  B+树的非叶子节点不存储数据,因此树的每一层能够存储更多的索引数量。在层高相同的情况下,B+树可以存储更多的数据,同时,相同数量的数据在B+树中的高度可能会更低,这减少了磁盘I/O操作的次数,从而提高了查询速度。

2.范围查询的支持:
  B+树的叶子节点通过双向链表相连,这支持了范围查询。当进行范围查询时,只需要找到第一个符合范围条件的关键字,就可以通过链表指针一次性找到所有符合条件的关键字,而不需要进行多次查找。

3.数据稳定性:
  在B+树中,所有数据都存储在叶子节点,所以数据的插入、删除和更新等操作不会改变数据的相对位置,从而保证了数据的稳定性。这对于需要持久化存储的数据非常重要。

4.索引和数据分离:
  在MySQL中,B+树的非叶子节点仅存储键值和子节点指针,而不存储数据。这种索引和数据分离的设计使得B+树在查询时更加高效,因为索引查找和数据访问可以分别进行。

5.多路搜索:
  B+树是一个多路搜索树,这意味着每个节点可以有多个子节点。这使得B+树在查询时能够更快地定位到目标数据,提高了查询效率。

6.防止过度分裂:
  由于B+树的非叶子节点不保存关键字信息,只保存关键字的索引,所以相对于B树来说,B+树的非叶子节点可以拥有更多的子节点,从而减少了树的分裂次数,提高了性能。

  综上所述,MySQL选择B+树作为其索引数据结构是因为B+树在性能、范围查询支持、数据稳定性、索引和数据分离以及多路搜索等方面具有显著优势。这些优势使得B+树成为数据库索引的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用易查分制作扫码签到,支持在线签名,一键导出名单!

学校在开展培训讲座、研讨会等活动会议时,通常都需要参会人在纸质名单上签字表示到场。负责人不仅要耗费大量人力引导签到,如果人数众多,场面混乱,签到效率会十分低下。 易查分能够制作安全、高效的二维码签到系统,参会…

游泳带什么防水耳机好?甄选四大顶尖游泳耳机推荐,最值入手!

在享受游泳的同时,搭配一款优秀的防水耳机,能够让您的游泳体验更加完美。然而,市面上琳琅满目的防水耳机品牌,让人难以选择。作为一名游泳爱好者,我深知选购一款合适的防水耳机的重要性。因此,我自费购买了…

MHD093C-058-PG1-AA具备哪些特点?

MHD093C-058-PG1-AA是一种高性能的伺服电机控制器。 该产品具备以下特点: 高精度与高性能:MHD093C-058-PG1-AA设计用于提供精确的运动控制和定位,适用于需要高精度定位和控制的场合。快速响应:采用先进的控制技术,确…

高血压患者可以吃什么?不可以吃什么?

点击文末领取揿针的视频教程跟直播讲解 随着生活水平的提高,越来越多的人得上了“新四高”——高血压、高血脂、高血糖、高尿酸。 一旦惹上这些慢性病,那就得「管住嘴」了~但究竟什么能吃、什么不能吃,还是有很多人不清楚 高血压患者应该遵…

2024/5/14 英语每日一段

“It is important as it suggests that possibly several populations in the world already started to include substantial amount of plants in their diet” in the period before agriculture was developed, a view contradictory to the popular one, added archeo-ge…

【C#】 SortedDictionary,查找字典中是否存在给定的关键字

欢迎来到《小5讲堂》 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景场景说明红黑树原理判断代码Dictionary知识点相关文章 背景 最近…

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数 1、 def go(a, b):Spaceship.step(2)Dev.step(a)Spaceship.step(b)Dev.turnRight()Dev.step(b)Dev.turnLeft()Dev.step(-a) Dev.turnLeft() Dev.step(3) Dev.step(-3) go(3, 2) go(6, 1) go(5, 2) go(4, 3)2、 def go(…

高校普法|基于SSM+vue的高校普法系统的设计与实现(源码+数据库+文档)

高校普法系统 目录 基于SSM+vue的高校普法系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3律师功能模块 4学生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

RockChip Android8.1 EthernetService分析

一:概述 本篇文章将围绕RK Android8.1 SDK对Ethernet做一次框架分析,包含Framework层和APP层。 当前版本SDK默认只支持一路Ethernet,熟悉Ethernet工作流程后通过修改最终会在系统Setting以太网中呈现多路选项(可以有多种实现方式),博主通过增加ListPreference实现的效果…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

26版SPSS操作教程(高级教程第二十一章)

目录 前言 粉丝及官方意见说明 第二十一章一些学习笔记 第二十一章一些操作方法 信度分析 问卷信度分析 假设数据 具体操作 结果解释 下面进行进一步分析 结果解释 其他常用信度系数介绍 概化理论SPSS中的实现 结果解释 项目反应理论&#xff08;item respons…

学校为何更热衷于使用SOLIDWORKS教育版教学

在当今的教育环境中&#xff0c;SOLIDWORKS教育版因其独特的优势&#xff0c;越来越受到学校的青睐。为什么学校更热衷于使用SolidWorks教育版进行教学呢&#xff1f;本文将从以下几个方面进行阐述。 首先&#xff0c;SOLIDWORKS教育版为学生们提供了一个与实际工程应用紧密结…

一文分享:抖音外卖城市合伙人如何申请合作?

在当今数字化时代&#xff0c;外卖和团购业务蓬勃发展&#xff0c;商家们纷纷寻求在多个平台上拓宽销售渠道&#xff0c;以获取更多的订单和利润&#xff0c;这也给创业者提供创来机会。在这其中&#xff0c;抖音外卖作为一股新势力&#xff0c;自然吸引了众多创业者的目光&…

YOLO使用笔记

下载oss命令工具。 在OSS.exe文件下打开Power Shell, 输入指令&#xff1a; ./oss login之后输入用户名和密码。 选择将你想要上传的文件导入&#xff1a; ./oss cp {yourdir} oss://进入服务器实例中&#xff0c;打开终端下载数据 同样输入:oss login 进行登录。 登录成功…

[蓝桥杯]真题讲解:合并数列(双指针+贪心)

[蓝桥杯]真题讲解&#xff1a;班级活动&#xff08;贪心&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;合并数列&#xff08;双指针贪心&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define in…

LVS超详细入门介绍

LVS 一、LVS入门介绍 1.1.LVS负载均衡简介 1.2.负载均衡的工作模式 1.2.1.地址转换NAT&#xff08;Network Address Translation&#xff09; 1.2.2.IP隧道TUN&#xff08;IP Tunneling&#xff09; 1.2.3.直接路由DR&#xff08;Direct Routing&#xff09; 1.3.…

算法课程笔记——路径相关树形DP

算法课程笔记——路径相关树形DP #include<bits/stdc.h>usingnamespacestd; usingLL longlong; constintN 2005; vector<int>e[N],t; structasdf{vector<int> vec; LL val; }; vector<asdf>w[N]; LL dp[N]; intn,m,k,dep[N]{1},f[N]; voiddfs(in…

通过GRE隧道实现OSPF、BGP、IS-IS的套接使用

正文共&#xff1a;999 字 9 图&#xff0c;预估阅读时间&#xff1a;1 分钟 书接上文&#xff08;专线入云场景能否配置动态路由协议&#xff1f;&#xff09;&#xff0c;我们发现通过一定的配置&#xff0c;具体就是组合使用IBGP和静态路由&#xff0c;在使用云专线接入到资…

国内验签DV单域名SSL证书怎么购买?

JoySSL所签发的专业版单域名SSL证书可以做到国内验签&#xff0c;数据不出境&#xff0c;安全等级为业内最高。 JoySSL 专业版国际算法DV单域名证书-JoySSLJoySSL专业版国际算法DV单域名证书通过交叉授信方式&#xff0c;实现国产根与欧美根相互验证&#xff0c;完美兼容且自主…

Xmind Pro 2024 24安装教程

Xmind 应该是目前最好用的一款思维导图软件了。拥有优秀的用户体验&#xff0c;凭借简单易用&#xff0c;功能强大的特点&#xff0c;XMind在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软件。 Xmind 具有如下优点 ①、用心打磨16年的思维导图软件 ②、评…