深入解析MySQL索引结构:从数组到B+树的演变与优化
前言: 在数据库查询中,索引是一种关键的性能优化工具。然而,索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效,深入了解索引结构的演变过程尤为重要。
- MySQL 的索引数据结构从简单到复杂,主要经历了以下几个阶段:
1. 数组和链表:简单但低效的起步

- 特点:
- 数组:支持快速等值查找,但插入和删除效率低,时间复杂度为 O(n)。
- 链表:动态插入删除效率高,但查找需要线性扫描,效率低。
- 局限性:
- 不适合范围查询和频繁插入、删除的场景。
- 对于大规模数据,查找性能难以满足需求。
2. 二叉搜索树:提升效率但不稳定

-
特点:
- 左子树的节点值 < 根节点,右子树的节点值 > 根节点。
- 查找、插入和删除的时间复杂度为 O(log n)。
-
问题:
- 数据分布不均衡时,可能退化为链表,复杂度降为 O(n)。
- 不适合大规模数据的磁盘 I/O 场景。
3. 红黑树:平衡性与效率的折中

-
特点:
- 通过颜色属性(红/黑)及旋转操作保持平衡。
- 时间复杂度稳定为 O(log n),插入、删除效率较高。
-
局限性:
- 树的高度仍较大,对于磁盘 I/O 敏感的场景性能不足。
- 更适合内存索引,不适用于大规模数据存储。
4. B-树:为磁盘优化的多叉平衡树

-
特点:
- 节点可容纳多个关键字,减少树的高度。
- 支持等值查询和范围查询,插入和删除通过节点分裂保持平衡。
-
优点:
- 更少的树高意味着更少的磁盘 I/O,适合海量数据查询。
-
局限性:
- 叶子节点和非叶子节点都存储数据,占用更多空间。
- 查询路径不稳定,非叶子节点也可能存储数据,影响效率。
5. B+树:数据库索引的主流选择

-
改进点:
- 所有数据存储在叶子节点:非叶子节点只存储索引,减少节点大小,进一步降低树高。
- 叶子节点链表连接:支持高效范围查询,链表可直接顺序扫描。
-
优点:
- 查询性能稳定:所有查找操作都到达叶子节点,路径固定,效率更高。
- 适配范围查询:链表结构使范围查询更加高效。
- 磁盘 I/O 优化:单节点存储更多索引值,减少访问磁盘的次数。
-
缺点:
- 非叶子节点为冗余索引,占用空间稍多。
6. B+树 vs B-树:直观对比
| 特点 | B-树 | B+树 |
|---|---|---|
| 数据存储 | 数据存储在叶子节点和非叶子节点 | 数据存储仅在叶子节点 |
| 非叶子节点的功能 | 既存储索引也存储数据 | 仅存储索引信息 |
| 叶子节点的连接 | 无链表连接 | 叶子节点通过链表连接 |
| 查找效率 | 每次查找到达某个节点即可 | 必须查找到叶子节点(范围查询效率更高) |
| 空间占用 | 较少 | 较多 |
| 范围查询 | 需要在树中逐层遍历 | 叶子节点链表可以直接实现范围查询 |
7. 哈希:精准查询的快刀

-
优点:
- 时间复杂度 O(1),适合精确匹配查询。
- 实现简单,广泛用于 NoSQL 数据库和缓存系统(如 Redis、Memcached)。
-
局限性:
- 不支持范围查询,随机化存储导致无法顺序访问。
- 数据冲突处理(如链表法、开放地址法)会影响性能。
8. 为什么 MySQL 选用 B+树?
-
优化磁盘 I/O:
- 非叶子节点仅存储索引,减少节点大小,提高磁盘页的利用率。
- 树高降低,减少查询时的磁盘访问次数(通常仅需 3-4 次 I/O)。
-
查询性能稳定:
- 所有查找都需到叶子节点,路径长度固定,性能更均匀。
-
支持范围查询:
- 叶子节点链表连接,可顺序扫描,天然适配范围查询和分页。
-
维护成本低:
- 插入和删除操作只需局部调整,不影响整体结构。
-
数据库特性匹配:
- B+树索引性能适配高并发查询、大规模数据存储等场景。
结束语:MySQL 索引结构的演变从简单的数组、链表到红黑树、B-树,再到 B+树的最终选择,背后折射的是对性能、存储效率和功能适配的不断优化。这不仅仅是一种技术选择,更是一种工程智慧。
——如果觉得有帮助,😊点个赞支持一下吧!——
相关文章:
深入解析MySQL索引结构:从数组到B+树的演变与优化
前言: 在数据库查询中,索引是一种关键的性能优化工具。然而,索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效,深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂࿰…...
【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?
今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法ÿ…...
jmeter并发用户逐步递增压测找性能拐点
jmeter并发用户逐步递增压测找性能拐点 目的: 使用逐层递增的并发压力进行测试,找到单功能的性能拐点(一般需要包含四组测试结果,拐点前一组,拐点一组,拐点后两组),统计响应时间、…...
【PostgreSQL使用】最新功能逻辑复制槽的failover,大数据下高可用再添利器
逻辑复制的failover 专栏内容: postgresql入门到进阶手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ✅ ὒ…...
【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)
本文项目编号 T 102 ,文末自助获取源码 \color{red}{T102,文末自助获取源码} T102,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Linux下Nvidia显卡GPU开启驱动持久化
GPU开启驱动持久化的原因 GPU 驱动一直处于加载状态, 减少运行程序时驱动加载的延迟。不开启该模式时,在程序每次调用完 GPU 后, GPU 驱动都会被卸载,下次调用时再重新加载, 驱动频繁卸载加载, GPU 频繁被…...
MS SQL Server 实战 排查多列之间的值是否重复
目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&am…...
【玩转MacBook】Git安装
Git 官网也提到了MacBook 可以使用 Homebrew 安装 Git,所以在此使用 Homebrew 安装。 1、安装 Homebrew 执行安装脚本 在 Terminal 中执行如下命令: /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.…...
【优先算法】双指针 --(结合例题讲解解题思路)(C++)
今日鸡汤: “无人负我青云志,我自踏雪至山巅。” -徐霞客《青云志》 释义:没有人能够帮助我实现我的理想,即使面对再大的困难,我也要踏着积雪,一步步,到达山巅。 目录 1.快乐数 2.盛最多的…...
简述css中z-index的作用?如何用定位使用?
z-index是一个css属性,用于控制元素的堆叠顺序, 如何使用定位用index 1、position:relative; z-index; 相对于自己来定位的,可以根据top,bottom,right,leftÿ…...
Redis——数据淘汰策略
文章目录 1. 引入2. 讲解2.1 Redis 中的 8 种数据淘汰策略2.2 LRU 和 LFU 算法2.3 建议 3. 总结 1. 引入 在 Redis——数据过期策略 的“引入”部分讲解过,Redis 的数据存在内存中,而内存容量相对较小,不能将大量数据 无限期 地缓存。然而&a…...
机器学习之KNN算法预测数据和数据可视化
机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点:缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…...
前端node.js
一.什么是node.js 官网解释:Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 二.初步使用node.js 需要区分开的是node.js和javascript互通的只有console和定时器两个API. 三.Buffer Buffer 是一个类似于数组的对象,用于表示固定长度的字节序列。 Buffer…...
Excel基础知识
一:数组 一行或者一列数据称为一维数组,多行多列称为二维数组,数组支持算术运算(如加减乘除等)。 行:{1,2,3,4} 数组中的每个值用逗号分隔列:{1;2;3;4} 数组中的每个值用分号分隔行列…...
Spring Boot对访问密钥加密解密——RSA
场景 用户无需登录,仅仅根据给定的访问keyId和keySecret就可以访问接口。 keyId 等可以明文发送(不涉及机密),后端直接从请求头读取。keySecret 不可明文,需要加密后放在另一个请求头(或请求体࿰…...
Vue介绍
一、Vue框架简介 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它的核心库只关注视图层,易于上手,并且可以与其他库或现有项目进行整合。其特点包括响应式数据绑定、组件化开发和虚拟DOM等。 响应式数据绑定 Vue通过Object.defineProperty()方法来进行数据劫持。当…...
表单元素(标签)有哪些?
HTML 中的表单元素(标签)用于收集用户输入的数据,常见的有以下几种: 文本输入框 <input type"text">:用于单行文本输入,如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…...
人工智能与云计算的结合:如何释放数据的无限潜力?
引言:数据时代的契机 在当今数字化社会,数据已成为推动经济与技术发展的核心资源,被誉为“21世纪的石油”。从个人消费行为到企业运营决策,再到城市管理与国家治理,每个环节都在生成和积累海量数据。然而,数…...
TCP Analysis Flags 之 TCP Out-Of-Order
前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…...
【MyBatis 核心工作机制】注解式开发与动态代理原理
有很多朋友可能已经在开发中熟练使用 MyBatis 或者刚开始学习 MyBatis,对于它的一些工作机制不太了解。“咦,怎么写几个注解,写几个配置文件,就能实现这些效果呢,好神奇呀!”当你看完这篇博客之后…...
5个维度精通Common Voice:开源语音数据集全栈应用指南
5个维度精通Common Voice:开源语音数据集全栈应用指南 【免费下载链接】cv-dataset Metadata and versioning details for the Common Voice dataset 项目地址: https://gitcode.com/gh_mirrors/cv/cv-dataset 在语音识别技术快速发展的今天,高质…...
Java 25虚拟线程压测全对比:Spring WebFlux vs Virtual Threads vs Project Loom原生方案,谁才是百万QPS终极解?
第一章:Java 25虚拟线程压测全对比:Spring WebFlux vs Virtual Threads vs Project Loom原生方案,谁才是百万QPS终极解?Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,标志着J…...
Python数据分析环境部署:Anaconda与Phi-3-mini协作指南
Python数据分析环境部署:Anaconda与Phi-3-mini协作指南 1. 为什么选择这个组合? 在开始动手之前,我们先聊聊为什么Anaconda和Phi-3-mini是数据科学家的好搭档。Anaconda就像是一个瑞士军刀,把Python环境管理和包依赖这些麻烦事都…...
英雄联盟终极工具箱:League Akari 完整使用指南与功能解析
英雄联盟终极工具箱:League Akari 完整使用指南与功能解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟客户端的…...
Xilinx Video IP(二)AXI4-Stream视频数据流与FIFO深度优化
1. AXI4-Stream视频数据流基础 第一次接触Xilinx的Video IP时,很多人会被AXI4-Stream接口搞得一头雾水。其实把它想象成一条传送带就很好理解了——视频数据就像流水线上的包裹,按照固定节奏从源头运送到目的地。这条"传送带"有几个关键特性&a…...
vLLM-v0.11.0完整指南:从环境搭建到Qwen3-VL-4B服务调用全流程
vLLM-v0.11.0完整指南:从环境搭建到Qwen3-VL-4B服务调用全流程 1. 环境准备与快速部署 1.1 硬件与系统要求 要运行vLLM-v0.11.0并部署Qwen3-VL-4B模型,建议满足以下硬件配置: 显卡:NVIDIA GPU(推荐RTX 4060 Ti 16G…...
终极指南:在Apple Silicon Mac上修复Fiji启动失败问题
终极指南:在Apple Silicon Mac上修复Fiji启动失败问题 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji Fiji作为一款"开箱即用"的ImageJ发行版&…...
Fish-Speech-1.5在JavaWeb项目中的集成实践
Fish-Speech-1.5在JavaWeb项目中的集成实践 1. 引言 想象一下,你的JavaWeb应用能够像真人一样说话——电商平台的商品介绍不再冰冷生硬,在线教育的内容讲解充满情感波动,智能客服的回应自然流畅。这就是Fish-Speech-1.5带来的变革。 Fish-…...
基于Matlab实现 IEEE33节点配电网系统simulink仿真模型,并配套前推回代法潮流计算程序
基于Matlab实现 IEEE33节点配电网系统simulink仿真模型,并配套前推回代法潮流计算程序。 改进的IEEE33节点,潮流计算,电压分析,可自行加风机光伏,接电动机负载。 结果图如图所展示,附带IEEE33节点数据MATLA…...
Qwen3-Reranker完整指南:支持Markdown/HTML文档解析的增强版方案
Qwen3-Reranker完整指南:支持Markdown/HTML文档解析的增强版方案 1. 引言:重新定义文档检索的精准度 在日常工作中,你是否遇到过这样的困扰:用关键词搜索文档时,系统返回的结果看似相关,实际上却偏离了你…...
