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

在这里插入图片描述

文章目录

    • 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.mzph.cn/pingmian/20206.shtml

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

相关文章

LeeCode热题100(两数之和)

本文纯干货,看不懂来打我! 自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode) 简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来,展厅作为线下向公众传递信息的窗口,其设计风格与内容主题紧密相连,展现出千姿百态的面貌。然而,随着数字多媒体技术的日新月异,展厅不再仅仅是传统的信息展示平台,而是成为了引领内容展示潮流的风…

【Git】git合并分支指定内容到主分支

git合并分支指定内容到主分支 在现实开发中,往往需要合并分支内容,如下图: 我们平时在其他分支修改了部分代码,如何将分支部分代码合并到主分支上面呢? 合并步骤: 1、切换当前到主分支 git checkout m…

大型制造业集团IT信息化总体规划方案(65页PPT)

方案介绍: 本大型制造业集团IT信息化总体规划方案旨在通过构建先进、高效、稳定的IT信息化系统,支撑集团各业务领域的运营和管理需求,促进集团整体运营效率和竞争力的提升。通过实施本项目,集团将能够更好地应对市场变化和客户需…

python绘制piper三线图

piper三线图 Piper三线图是一种常用于水化学分析的图表,它能够帮助我们理解和比较水样的化学成分。该图表由三个部分组成:两个三角形和一个菱形。两个三角形分别用于显示阳离子和阴离子的相对比例,而菱形部分则综合显示了这些离子比例在水样…

十四天学会Vue——Vue 组件化编程(理论+实战)(第四天)

二、 Vue组件化编程 2.1 组件化模式与传统方式编写应用做对比: 传统方式编写应用 依赖关系混乱,不好维护:例如:比如需要引入js1,js2,js3,但是js3需要用到js1、2的方法,所以js1、2…

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求,Epson使用独家QMEMS*2技术所生产的石英振荡器,与其精巧的半导体技术所制造的射频传输器电路,开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm,更使其封装尺寸达仅3.2 mm x 2.5 mm,为客户大…

C#中接口的显式实现与隐式实现及其相关应用案例

C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”,增加实现接口的类访问方法的“成本”。 接口的显式实现和隐式实现: 先定义一个接口,接口…

dolphinscheduler docker部署海豚mysql版本,docker重新封装正在运行服务为镜像

1.官方文档: https://dolphinscheduler.apache.org/zh-cn/docs/3.2.1/guide/installation/standalone#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93 2.github: dolphinscheduler/docs/docs/zh/guide/howto/datasource-setting.md at 3.2.1-release apache/do…

对于vsc中的vue命令 vue.json

打开vsc 然后在左下角有一个设置 2.点击用户代码片段 3.输入 vue.json回车 将此代码粘贴 &#xff08;我的不一定都适合&#xff09; { "vue2 template": { "prefix": "v2", "body": [ "<template>", " <…

Ubuntu中PDF阅读器和编辑器

1. 福昕PDF编辑器 1.1. 下载地址 PDF阅读器下载_PDF编辑器下载_PDF软件官方下载_福昕软件官网 1.2. 安装 sudo dpkg -i signed_com.foxit.foxitpdfeditor_xxx_amd64_UOS.deb 2. WPS DPF 2.1. 下载地址 WPS Office 2019 for Linux-支持多版本下载_WPS官方网站 2.2. 使用 …

基于ES安装IK分词插件

前言 IK分词器插件是为Elasticsearch设计的中文分词插件&#xff0c;由Elasticsearch的官方团队之外的开发者medcl开发。它主要针对中文文本的分词需求&#xff0c;提供了较为准确的中文分词能力。以下是IK分词器插件的一些特点&#xff1a; 智能分词&#xff1a;IK分词器采用基…

每天学点小知识:WSL安装Ubuntu 22.04 LTS

前言 本章教会你在不使用虚拟机下使用linux&#xff0c;但是这里建议还是使用虚拟机&#xff0c;或者装一双系统&#xff0c;wsl使用linux还是有很多问题的。 1. 简介WSL WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软为Windows 10及以上版本开发的一项功能…

[AIGC] Java常用的JSON库及简单示例

Java常用的JSON库及简单示例 在Java的世界里&#xff0c;JSON库广泛用于日常开发工作&#xff0c;本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线&#xff0c;但一旦熟…

Redis用GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

淘宝镜像的https证书过期

错误原因&#xff1a; 淘宝镜像过期 早在 2021 年&#xff0c;淘宝就发文称&#xff0c;npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务&#xff08;直到 HTTPS 证书到期才真正不能用了…

基于stm32的智能家居系统

目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1 总体方案设计 2.2 DHT11模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 ESP8266WIFI模块介绍 2.5 MQ-135 空气质量模块介绍 2.6 步进电机模块介绍 2.…

solr-8.11.3

https://solr.apache.org/downloads.html https://archive.apache.org/dist/solr/solr/ F:\Document_Solr.apache.org\solr-8.11.3\bin Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。 C:\Users\Administrator>F: F:\> F:\>…

2023年03月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;共50分&#xff09; 第1题 有如下程序段&#xff1a; with open(mistakes.txt, w) as f:words [believe,memorize]f.write(\n.join(words))执行该代码后&#xff0c;…

springboot基础及上传组件封装

简介 本文主要以文件上传为demo&#xff0c;介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…