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

news2024/9/25 9:32:58

一、前言

  当我们发现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.coloradmin.cn/o/1677621.html

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

相关文章

HOJ 修改首页 和后端logo图片 网页收藏标识ico 小白也会的方法

HOJ 是一款优雅知性的在线评测系统,像一位温文尔雅的女性,你会慢慢喜欢上她的。 制作图片素材 用图像编辑软件 比如 **光影魔术手4.0** 制作以下素材 logo.a0924d7d.png 为前台导航栏左边的logo, 600*200 backstage.8bce8c6e.png 为后台侧…

虚拟化技术 在vCenter Server创建数中心、添加主机

一、实验内容 1.安装Flash 2.在vCenter Server创建数中心、添加主机 二、实验主要仪器设备及器材 1.安装有64位Windows操作系统的台式电脑或笔记本电脑,建议4C8G或以上配置 2.在Windows Server 2008 R2已安装vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

数据结构【顺序表】

文章目录 1.顺序表的概念线性表物理结构逻辑结构 2.顺序表的分类2.1静态顺序表2.2动态顺序表 3.顺序表接口的实现头文件(SQList.h)如下源文件初始化顺序表销毁顺序表插入扩容尾插头插 封装扩容函数删除尾删头删 查找元素在指定位置前插入数据情况一(指定的位置不是首元素)情况二…

CMF认证是什么?怎么报名?考试费用多少?有必要参加培训吗?

CMF认证是由国际变革管理学院(CMI)颁发的一种认证,旨在评估个人在变革管理领域的知识和技能,并确认其在该领域具备专业能力。通过学习和理解变革管理知识体系(CMBoK),参与者可以掌握变革管理的理…

4 特征构造

4 特征构造 学习目标 知道未来信息的概念,及处理未来信息的方法掌握从原始数据构造出新特征的方法掌握特征变换的方法掌握缺失值处理的方法1 数据准备 1.1 梳理数据的内在逻辑 关系种类 一对一:一个用户有一个注册手机号 一对多:一个用户多笔借款 多对多:一个用户可以…

第1章 初始Spring Boot【仿牛客网社区论坛项目】

第1章 初始Spring Boot【仿牛客网社区论坛项目】 前言推荐项目总结第1章初识Spring Boot,开发社区首页1.课程介绍2.搭建开发环境3.Spring入门体验IOC容器体验Bean的生命周期体验配置类体验依赖注入体验三层架构 4.SpringMVC入门配置体验响应数据体验响应Get请求体验…

【原创】java+springboot+mysql企业邮件管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

jar包安装成Windows服务

一、前言 很多年前写过一篇《使用java service wrapper把windows flume做成服务》的文章,也是把jar包安装成windows服务,今天介绍另外一种更简便的方案。 二、正片 这次使用的工具是 winsw,一个Windows服务包装器。下面看详细介绍 首先从g…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

神策数据付力力入选福布斯中国 30 Under 30 十周年名人堂

福布斯中国 30 UNDER 30(U30) 持续关注青年才俊。在 U30 十周年之际,福布斯中国通过跟踪、梳理、比较历年 U30 们入选后的表现、社会影响力事件,以及创业精神诠释,编制了福布斯中国首期 U30 名人堂名单。神策数据联合创…

低代码开发平台在城市数字化转型中的技术实现与案例分析

城市数字化转型需要政策引导、技术创新、基础设施建设、人才培养、多方合作以及安全保障等全方位的支持与助力,共同推动城市的数字化进程,提升其竞争力和可持续发展能力。 其中,技术创新是推动数字化转型的核心动力,需要不断加强…

从零开始详解OpenCV条形码区域分割

前言 在识别二维码之前,首先要划分出二维码的区域,在本篇文章中将从零开始实现二维码分割的功能,并详细介绍用到的方法。 我们需要处理的图像如下: 完整代码 首先我们先放出完整代码,然后根据整个分割流程介绍用到…

英伟达的GDS

英伟达的GDS,即GPUDirect Storage,是英伟达开发的一种技术,它允许GPU直接访问存储设备,从而显著提高数据传输效率和性能。 以下是对英伟达GDS的详细介绍: 一、GDS技术的主要特点和优势 直接内存存取:GDS通…

【设计模式】JAVA Design Patterns——Acyclic Visitor(非循环访问者模式)

🔍目的 允许将新功能添加到现有的类层次结构中,而不会影响这些层次结构,也不会有四人帮访客模式中那样循环依赖的问题。 🔍解释 真实世界例子 我们有一个调制解调器类的层次结构。 需要使用基于过滤条件的外部算法(是…

使用 python 整理 latex 的 bib 文献列表

目录 bib 文献整理脚本前提条件与主要功能原理编程语言与宏包基础完整程序 bib 文献整理脚本 本文主要用于解决 Latex 写作过程中遇到的 bib 文献整理问题,可处理中文文献。 LaTeX是一种基于ΤΕΧ的排版系统,它非常适用于生成高印刷质量的科技和数学类…

八大设计模式:适配器模式实现栈的泛型编程 | 通用数据结构接口的秘诀(文末送书)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

pyautogui 基本用法

pyautogui 是一个 Python 库,可以让你用 Python 脚本控制鼠标和键盘。它适用于自动化桌面图形用户界面(GUI)的任务,比如自动化测试、游戏脚本或任何需要模拟用户输入的程序。 以下是使用 pyautogui 的一些基础示例: 安…

地平线旭日X3开发板编译USB网卡驱动 AX88772B

由于使用的激光雷达是网口输出的, 为了不占用X3派已有的网口,接上去了一个绿联的usb网卡, 发现系统没有驱动,所以动手看看能不能自己编译一个 首先lsusb查看一下网卡型号 发现型号是AX88772B,去官网看了一下&#x…

低空经济之无人机

朋友们,今天来聊聊个超酷的话题——低空经济之无人机! 无人机不仅让天空变得触手可及,还带来了无尽的商业可能,简直就是新时代的“空中小助手”啊! 说到无人机,你们是不是也和我一样,脑海里立马…

【数据结构】队列的实现(链式)

文章目录 队列1.队列的概念及结构概念结构 2.队列的实现(链式结构)队列定义初始化队列入队出队获取队头元素获取队尾元素销毁队列判断队列是否为空队列有效个数 完整代码(包含测试代码)Queue.hQueue.ctest.c 队列 1.队列的概念及…