[每周一更]-(第99期):MySQL的索引为什么用B+树?

news2024/11/19 13:20:42

在这里插入图片描述

文章目录

    • B树与B+树的基本概念
      • B树(Balanced Tree)
      • B+树(B-Plus Tree)
      • 对比
    • 为什么MySQL选择B+树
      • 1. **磁盘I/O效率**
      • 2. **更稳定的查询性能**
      • 3. **更高的空间利用率**
      • 4. **并发控制**
    • 其他树结构的比较
    • 参考

索引是一种 数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。MySQL索引有三类:B+树索引、Hash索引、全文索引

在数据库系统中,索引是提高数据检索效率的关键工具。而在MySQL中,B+树索引是最常用的一种索引结构。理解为什么MySQL选择使用B+树而不是B树或其他树结构,首先需要深入了解B+树和B树的特性及其在数据库检索中的表现。

B树与B+树的基本概念

B树(Balanced Tree)

B树是一种自平衡的多叉树数据结构,其中每个节点可以包含多个子节点和键。B树的每个节点都包含键和子节点指针,叶子节点不需要保持在同一层。

B树的特性包括:

  1. 每个节点包含多个键:每个节点至少包含 ⌈m/2⌉−1个键,至多包含 m−1 个键,m 为B树的阶数。
  2. 所有叶子节点在相同深度:树的所有叶子节点处于同一深度。
  3. 平衡性:插入和删除操作保持树的平衡。

B+树(B-Plus Tree)

B+树是B树的一种变体,具有以下特点:

  1. 叶子节点链表:所有叶子节点通过链表相连,形成一个有序链表。
  2. 非叶子节点只存储键:非叶子节点不存储数据,只存储键和子节点指针,数据仅存储在叶子节点中。
  3. 更高的节点分支因子:因为非叶子节点只存储键,B+树相对于同阶的B树可以存储更多的键,从而减少树的高度。

对比

特性B树B+树
节点存储键和数据内部节点存储键,叶子节点存储数据
键的数量⌈m/2⌉−1到 m−1⌈m/2⌉−1到 m−1
子节点指针数量⌈m/2⌉ 到 m⌈m/2⌉ 到 m
数据存储位置内部节点和叶子节点仅在叶子节点
叶子节点链表不存在存在(叶子节点通过链表连接)
查询效率O(logmN),从根节点到叶子节点O(logmN),从根节点到叶子节点
插入/删除操作相对复杂,需要调整节点相对复杂,需要调整叶子节点链表和节点
范围查询效率较差,需要遍历多个节点优秀,叶子节点通过链表有序连接
顺序访问较差,需要中序遍历树优秀,通过链表遍历叶子节点
空间利用率较高较高,叶子节点存储更多数据
适用场景频繁插入、删除操作高效范围查询、顺序访问、数据库索引

B树

  • 适用于需要频繁插入和删除操作的场景。
  • 数据既存储在内部节点也存储在叶子节点。
  • 查询和更新操作效率较高,但范围查询和顺序访问效率较低。

B+树

  • 适用于需要高效范围查询和顺序访问的场景。
  • 数据仅存储在叶子节点,内部节点只存储键。
  • 叶子节点通过链表连接,提高了范围查询和顺序访问的效率。

为什么MySQL选择B+树

1. 磁盘I/O效率

数据库检索的效率很大程度上取决于磁盘I/O操作的效率。B+树的结构有利于减少磁盘I/O操作:

  • 叶子节点链表:B+树的所有叶子节点通过链表相连,支持顺序访问。当进行范围查询时,只需在链表中遍历叶子节点即可,大大提高了范围查询的效率。
  • 更高的节点分支因子:由于非叶子节点只存储键,B+树可以在同样大小的节点中存储更多的键和子节点指针,从而减少树的高度。更少的高度意味着在检索时需要更少的磁盘I/O操作。

2. 更稳定的查询性能

B+树的查询性能更加稳定,尤其是在范围查询和排序操作中表现突出:

  • 范围查询:B+树的叶子节点通过链表相连,进行范围查询时只需遍历链表,性能较为稳定。
  • 排序:B+树的叶子节点本身是有序的,支持高效的排序操作。

3. 更高的空间利用率

B+树的空间利用率更高,因为它将数据仅存储在叶子节点中,而非叶子节点只存储键和指针。相比之下,B树的每个节点都存储数据和指针,导致空间利用率较低。

4. 并发控制

B+树的结构有助于提高并发控制能力:

  • 分裂和合并操作:在插入和删除操作时,B+树的分裂和合并操作相对简单且对树的结构影响较小,这有助于提高并发操作的性能和稳定性。

与 B 树相比,B+树具有以下优点:

  • 更矮胖的树: B+树的非叶子结点不存储数据,因此可以存储更多的索引,从而使树更加矮胖。这使得查询数据时需要访问的树的层数更少,从而提高查询效率。
  • 更快的范围查询: B+树的叶子结点按关键字顺序存储,并且相邻的叶子结点之间有指针相连,因此可以很有效地支持范围查询。

B树与B+树比较

  • B+树层级更少,查找更快
  • B+树查询速度稳定:由于B+树所有数据都存储在叶子节点,所以查询任意数据的次数都是树的高度h
  • B+树有利于范围查找
  • B+树全节点遍历更快:所有叶子节点构成链表,全节点扫描,只需遍历这个链表即可
  • B树优点:如果在B树中查找的数据离根节点近,由于B树节点中保存有数据,那么这时查询速度比B+树快。

其他树结构的比较

虽然B+树在数据库索引中表现优异,但了解其他树结构的优缺点也有助于全面理解数据库索引的选择:

  • AVL树:AVL树是一种高度平衡的二叉搜索树,每次插入和删除操作都会导致旋转,以保持平衡。虽然AVL树的查找效率高,但由于频繁的旋转操作,其插入和删除效率较低,不适合频繁更新的数据库环境。
  • 红黑树:红黑树是一种自平衡的二叉搜索树,通过颜色标记节点并进行旋转操作来保持平衡。红黑树的插入和删除效率高于AVL树,但由于其二叉结构,相对于多叉树的B+树,磁盘I/O效率较低。

各种树解决的问题以及面临的新问题

  • 二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表;

  • 平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低;

  • 红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多;

  • B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;

  • B+树:在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。

MySQL选择B+树作为索引结构是基于其在磁盘I/O效率、查询性能、空间利用率和并发控制等方面的优势。B+树通过将数据存储在叶子节点并使用链表连接叶子节点,实现了高效的范围查询和排序操作,同时减少了磁盘I/O操作的次数,提供了稳定的查询性能。这些特点使得B+树成为MySQL数据库索引的首选结构。

参考

  • 知乎 - MySQL 为什么使用 B+ 树来作索引?
  • Github - B树和B+树详解

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

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

相关文章

笔记-docker基于ubuntu22.04安装Jitsi Meet

背景 利用JitsiMeet打造一个可以在线会议的环境,根据躺的坑,做个记录 参考 JitsMeet部署安装说明 开始操作 环境 docker run -it --name ubuntu22.04 ubuntu:22.04 /bin/bash问题 1、安装 openjdk-11 apt install openjdk-11-jdk配置环境变量&…

Arduino RP2040 CDC虚拟串口通讯--普通串口不显示

这两天在用RP2040运行些程序,但发现一个问题,使用arduino IDE可以通过串口显示数据,但是其他串口工具不会显示数据,可以打开串口,排查一下午无果,相当头疼, 晚上搜索时发现这个介绍&#xff1a…

strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟

strcpy的使用和模拟&#xff08;作用&#xff09; 将一个字符串的内容复制到另外一个字符串中代替掉。 strcpy的使用效果 #include <stdio.h> #include <string.h>int main () {char str1[]"Sample string";char str2[40];char str3[40];strcpy (str2…

使用pytorch搭建textCNN、BERT、transformer进行文本分类

首先展示数据处理后的类型&#xff1a; 第一列为文本&#xff0c;第二类为标注的标签&#xff0c;数据保存在xlsx的表格中&#xff0c;分为训练集和验证集。 textCNN 直接上整个工程代码&#xff1a; import pandas as pd import numpy as np import torch from torch.util…

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一)&#xff1a;冒泡排序 Java排序算法(二)&#xff1a;选择排序 Java排序算法(三)&#xff1a;插入排序 Java排序算法(四)&#xff1a;快速排序 Java排序算法(五)&#xff1a;归并排序 Java排序算法(六)&#xff1a;希尔排序 Java排序算法(…

vm-bhyve网卡设定桥接故障解决@FreeBSD

问题 在使用vm-bhyve虚拟机管理软件的时候&#xff0c;使用vm无法绑定网卡igb0 vm switch add public igb0 报错&#xff1a;/usr/local/sbin/vm: ERROR: failed to add member igb0 to the virtual switch public 解决 于是准备用原生ifconfig命令来绑定&#xff0c;结果…

Pytorch的学习

1.基本数据&#xff1a;Tensor Tensor&#xff0c;即张量&#xff0c;是PyTorch中的基本操作对象&#xff0c;可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看&#xff0c;Tensor与NumPy的ndarrays非常类似&#xff0c;相互之间也可以自由转换&#xff0c;只不过Te…

六一儿童节与AIGC:科技与童趣的奇妙融

随着人工智能生成内容&#xff08;AIGC&#xff09;技术的发展&#xff0c;越来越多的应用和网站专门为儿童提供学习、游戏和绘画方面的支持。这些平台不仅能够提高孩子们的学习兴趣&#xff0c;还能激发他们的创造力。在六一儿童节即将到来之际&#xff0c;让我们来介绍几款利…

Jmeter安装教程

1 Jmeter下载 Jmeter下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi&#xff0c;选择需要的版本点击下载 解压jmeter安装包 解压后的安装包如下&#xff1a; 2 配置Jmeter环境变量 进入环境变量配置页面&#xff1a;计算机->属性->高级系统设置-&…

javascript DOM 属性详解:读取、修改、移除

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、读取…

[Algorithm][动态规划][子序列问题][最长递增子序列的个数][最长数对链]详细讲解

目录 1.最长递增子序列的个数1.题目链接2.算法原理详解3.代码实现 2.最长数对链1.题目链接2.算法原理详解3.代码实现 1.最长递增子序列的个数 1.题目链接 最长递增子序列的个数 2.算法原理详解 注意&#xff1a;本题思路和思维方式及用到的方法很值得考究&#xff0c;个人感…

springboot 项目集成 knife4j

官方版本推荐 版本依赖 spring boot 2.3.12.RELEASE 和 knife4j 2.0.9 引入依赖 完整的pom.xml文件 <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter --> <dependency><groupId>com.github.xiaoymin</groupI…

C# 类型系统

1. 隐式类型 c#允许使用 var 声明变量&#xff0c;编译期会通过初始化语句右侧的表达式推断出变量的类型。 // i is compiled as an int var i 5;// s is compiled as a string var s "Hello";// a is compiled as int[] var a new[] { 0, 1, 2 };// expr is co…

人脸识别模型与人类视觉识别的对比——评估人脸识别模型存在偏见是否比人类的偏见大?

1. 概述 人脸识别系统是一个几十年来一直备受关注的研究领域。而且在过去的几年中。公司和政府一直在积极引入人脸识别系统&#xff0c;并且我们看到越来越多的机会可以看到人脸识别系统。例如&#xff0c;有的系统可以随便介绍&#xff0c;如搜索特定人的图像&#xff08;图像…

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器&#xff0c;目前已经被许多大型站点所采用&#xff0c;如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…

switch语句

作用 让顺序执行的代码&#xff0c;产生分支。 基本语法 switch(变量) {//变量 常量 执行 case和 break之间的代码case 常量:满足条件执行的代码逻辑;break;case 常量:满足条件执行的代码逻辑;break;//case 可以有无数个default://如果上面case的条件都不满足 就会执行 def…

js四舍五入和计算精度问题处理

js四舍五入和计算精度问题处理 目录 js四舍五入和计算精度问题处理错误计算方法示例代码 js中加减乘除&#xff0c;部分数据会存在计算不准确。 错误计算 我使用的是big.js&#xff0c;基于big.js库封装了下工具方法&#xff0c;当然也可以用其他库&#xff0c;如mathjs/bignu…

【学习笔记】计算机组成原理(九+十)

控制单元的功能 文章目录 控制单元的功能9.1 微操作命令的分析9.1.1 取指周期9.1.2 间址周期9.1.3 执行周期9.1.4 中断周期 9.2 控制单元的功能9.2.1 控制单元的外特性9.2.2 控制信号举例9.2.3 多级时序系统9.2.4 控制方式 控制单元的设计10.1 组合逻辑设计10.1.1 组合逻辑控制…

04-树5 Root of AVL Tree(浙大数据结构PTA习题)

04-树5 Root of AVL Tree 分数 25 作者 陈越 单位 浙江大学 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more th…