MySQL 进阶专题:索引(索引原理/操作/优缺点/B+树)
在数据库的秋招面试中,索引(Index)是一个经典且高频的题目。索引的作用类似于书中的目录📖,它能够显著加快数据库查询的速度。本文将深入探讨索引的概念、作用、优缺点以及背后的数据结构,帮助你从原理到应用全面掌握这一重要知识点。
什么是索引?🤔
在数据库中,索引是一种特殊的数据结构,用于加快查询操作的速度。当我们执行 SELECT
查询时,数据库默认会通过逐行扫描的方式来完成查询。例如,当我们使用 WHERE
语句进行条件查询时,数据库会依次读取数据表的每一行,并将其带入条件中进行判断。这种遍历操作的时间复杂度是 O(N),其中 N 是表中的总行数。
然而,这种遍历操作有一个显著的问题:每次读取一行数据都需要访问硬盘💾。硬盘 I/O 的速度远低于内存操作,尽管时间复杂度是 O(N),实际执行效率却受到硬盘性能的极大限制。因此,索引通过创建一个有序的数据结构(如 B+ 树)充当数据的目录,使得数据库可以快速定位满足条件的数据,避免对表数据的全表扫描,从而显著提升查询速度🚀。
索引的优缺点 ⚖️
优点 ✅
-
加快查询速度:索引的最大优势在于它可以显著提高查询效率,尤其是在处理大数据量的场景下。通过索引,数据库可以快速定位到目标数据行,避免无效扫描。
-
适用于高频查询场景:在许多实际业务中,查询操作的频率远远高于数据的增删改操作。引入索引后,整体性能会得到显著提升。
-
支持复杂查询:索引不仅适用于简单的等值查询,还能提高范围查询(如
>
和<
)、模糊匹配(如LIKE
)以及多表连接的效率。
缺点 ❌
-
占用额外存储空间:索引本质上是一种额外的数据结构,需要占用存储空间。对于嵌入式设备或存储资源有限的环境,过多的索引可能会成为瓶颈。
-
影响增删改效率:在插入、删除和更新操作时,索引也需要同步更新,这会额外增加 I/O 操作。例如,执行以下 SQL:
DELETE FROM student WHERE id = 5;
数据库需要先通过索引定位到目标数据行,然后更新索引结构。
-
需要精心设计:不合理的索引设计可能导致查询性能没有显著提升,甚至适得其反。因此,在实际应用中,需要根据具体业务场景对索引进行规划和调整。
操作索引的 SQL 语句 🛠️
在数据库中,我们可以通过以下 SQL 语句来操作索引:
1. 查看索引 👀
SHOW INDEX FROM table_name;
这条语句用于查看某个表的索引信息。通过它,我们可以了解表中已经创建了哪些索引,以及每个索引的具体属性。
2. 创建索引 🏗️
CREATE INDEX index_name ON table_name(column_name);
创建索引是一个需要谨慎操作的过程。对于小表来说,创建索引的影响较小;但对于大表来说,创建索引可能会触发大量的硬盘 I/O 操作,导致系统性能短暂下降。因此,在设计数据库时,应该提前规划需要创建的索引,尽量避免在线上环境对大表直接创建索引。
3. 删除索引 🗑️
DROP INDEX index_name ON table_name;
删除索引的操作相对简单,但需要注意的是,删除索引后,相关查询的性能可能会显著下降。删除索引的操作同样会对数据库资源造成一定的消耗。
索引背后的数据结构 🧩
索引的实现依赖于特定的数据结构。常见的索引数据结构包括二叉搜索树、哈希表和 B+ 树。然而,二叉搜索树和哈希表并不适合用于数据库索引。
为什么二叉搜索树和哈希表不适合?🛑
-
二叉搜索树:当数据量较大时,二叉搜索树的高度会显著增加,导致查询需要多次比较。每次比较都伴随着硬盘 I/O 操作,这会显著降低查询效率。
-
哈希表:哈希表虽然能够快速完成等值查询,但它不支持范围查询(如
>
和<
)以及模糊查询(如LIKE
)。此外,哈希表对多列的联合查询支持较弱,因此不适合作为数据库索引的基础数据结构。
B+ 树:数据库索引的理想选择 🌟
B+ 树是 B 树的一种改进数据结构,非常适合用于实现数据库索引。其主要特点包括:
-
降低树的高度,减少 I/O 操作:B+ 树是 N 叉树,每个节点可以存储多个键值,大大降低了树的高度。相比二叉树,B+ 树的查询路径更短,每次查询需要的 I/O 次数更少。
-
叶子节点构成全集,支持范围查询:B+ 树的叶子节点通过链表相连,构成数据的全集。这种结构使得范围查询非常高效,尤其适用于连续区间的数据检索。
-
查询性能稳定:在 B+ 树中,所有查询最终都会落到叶子节点。因此,无论查询的目标数据在哪里,查询的性能始终保持稳定。
-
非叶子节点存储索引键值:B+ 树的非叶子节点只存储索引的键值,而不存储实际的数据行。这种设计显著降低了非叶子节点的存储空间消耗,从而进一步减少了硬盘 I/O 操作。
B+ 树示意图 🌳
以下是一棵典型的 B+ 树的结构示意图,用于帮助理解其结构和特点:
[8 | 15]/ \[2 | 5 | 8] [11 | 13 | 15]/ | \ / | \ \[1] [3|4] [6|7] [10] [12] [13] [14 | 15]
特点分析:
- 非叶子节点:仅存储索引键值(如 8, 15 等),用来引导查询路径。
- 叶子节点:存储所有实际数据,并通过链表连接,形成完整的有序数据集。
- 范围查询:例如,查找范围
4 <= key <= 10
,只需要遍历从键 4 开始到键 10 结束的链表节点,无需逐个比较。
B+ 树的优化
通过 B+ 树的多叉结构,大幅降低树的高度,减少硬盘访问次数,显著优化数据库查询性能。
索引的实际应用场景 📋
-
高频查询表:如电商系统的商品表、用户表,通过索引显著提升基于主键或唯一键的查询性能。
-
排序和分组操作:索引能够优化
ORDER BY
和GROUP BY
的操作,减少排序所需的计算开销。 -
多表连接查询:索引支持高效的多表
JOIN
查询,在复杂查询场景下避免不必要的全表扫描。
总结 📝
索引是数据库优化的核心工具之一。通过合理设计和使用索引,可以显著提高查询效率,降低系统资源的使用成本。然而,索引的设计需要权衡查询和增删改操作的需求,结合具体业务场景做出合理的选择。
B+ 树是当前主流数据库中索引实现的核心数据结构,其高效的范围查询能力、稳定的查询性能以及较低的存储开销使其成为数据库索引的理想选择。希望本文的讲解能帮助你深入理解索引的原理,并在实际开发和面试中游刃有余。💪
相关文章:
MySQL 进阶专题:索引(索引原理/操作/优缺点/B+树)
在数据库的秋招面试中,索引(Index)是一个经典且高频的题目。索引的作用类似于书中的目录📖,它能够显著加快数据库查询的速度。本文将深入探讨索引的概念、作用、优缺点以及背后的数据结构,帮助你从原理到应…...

用NeuralProphet预测股价:AI金融新利器(附源码)
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:我用NeuralProphet模型预测了股票价格,发现其通过结合时间序列分析和神经网络算法,确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…...
【Elasticsearch】parent aggregation
在Elasticsearch中,Parent Aggregation是一种特殊的单桶聚合,用于选择具有指定类型的父文档,这些类型是通过一个join字段定义的。以下是关于Parent Aggregation的详细介绍: 1.基本概念 Parent Aggregation是一种聚合操作&#x…...
IDEA使用Auto-dev+DeepSeek 10分钟快速集成,让java开发起飞
在当今的软件开发领域,AI 工具的辅助作用愈发凸显,DeepSeek AI 便是其中的佼佼者。它凭借强大的自然语言处理能力和高效的代码生成能力,成为众多开发者的得力助手。而 IntelliJ IDEA 作为一款广受欢迎的集成开发环境(IDE),若能与 DeepSeek AI 无缝集成,无疑将为开发者带…...

ASP.NET Core中间件Markdown转换器
目录 需求 文本编码检测 Markdown→HTML 注意 实现 需求 Markdown是一种文本格式;不被浏览器支持;编写一个在服务器端把Markdown转换为HTML的中间件。我们开发的中间件是构建在ASP.NET Core内置的StaticFiles中间件之上,并且在它之前运…...

使用page assist浏览器插件结合deepseek-r1 7b本地模型
为本地部署的DeepSeek R1 7b模型安装Page Assist,可以按照以下步骤进行: 一、下载并安装Ollama 首先,你需要下载并安装Ollama,这是部署DeepSeek所必需的工具。你可以访问Ollama的官方网站(ollama.com)下…...
【华为OD-E卷 - 108 最大矩阵和 100分(python、java、c++、js、c)】
【华为OD-E卷 - 最大矩阵和 100分(python、java、c、js、c)】 题目 给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的…...

【Reading Notes】Favorite Articles from 2025
文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 极越之后,中国车市只会倒下更多人(2025年01月01日) 在这波枪林弹雨中,合资品牌中最…...
云计算行业分析
云计算作为数字经济的核心基础设施,未来十年将持续重塑全球科技格局,并渗透到几乎所有行业的数字化转型中。 一、云计算的发展潜力 1. 技术融合驱动爆发式创新 AI与云计算的深度耦合 - **智能云服务**:云厂商将提供预训练模型、自动化ML工…...

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途
1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多,删除代价也小。这种说法主要基于以下几个方面: (1)资源共享 内存空间:每个进程都有自己独立的内存空间,包括代码段…...

3.攻防世界 weak_auth
题目描述提示 是一个登录界面,需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码:123456 直接得到flag 常用弱口令密码(可复制) 用户名 admin admin-- admin or -- admin…...
代码随想录算法训练营| 二叉树总结
代码随想录 二叉树的理论基础:二叉树种类、存储方式、遍历方式、定义方式 二叉树遍历:深度优先和广度优先 二叉树属性:对称、深度、节点、平衡、路径、回溯 修改与构造:反转、构造、合并 涉及到二叉树的构造,无论普…...

Python OCR工具pytesseract识别数字验证码
直接下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 找的最新版本: 我添加了math 跟chinese(因为是国内网络的原因吧,下载都失败,所以不用选择,后面自己下载后,添加到相应目录就好&…...

SpringBoot开发(五)SpringBoot接收请求参数
1. SpringBoot接收请求参数 1.1. 获取参数的方式 (1)通过request对象获取参数 (2)RequestParam(针对请求头方式为x-www-form-ur lencoded) (3)RequestBody(针对请求头方式为application/json) …...

文件基础IO
理解"文件" 1-1 狭义理解 文件在磁盘里磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的磁盘是外设(即是输出设备也是输入设备)磁盘上的文件 本质是对文件的所有操作,都是对外设的输入和输出简称IO 1-2 广义理…...

05vue3实战-----配置项目代码规范
05vue3实战-----配置项目代码规范 1.集成editorconfig配置2.使用prettier工具2.1安装prettier2.2配置.prettierrc文件:2.3创建.prettierignore忽略文件2.4VSCode需要安装prettier的插件2.5VSCod中的配置2.6测试prettier是否生效 3.使用ESLint检测3.1VSCode需要安装E…...

八大排序算法细讲
目录 排序 概念 运用 常见排序算法 插入排序 直接插入排序 思想: 步骤(排升序): 代码部分: 时间复杂度: 希尔排序 思路 步骤 gap的取法 代码部分: 时间复杂度: 选择排序 直接选…...

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能
一、引言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志: 网络爬虫学习:应用selenium从搜*狐搜…...
docker安装es及分词器ik
系统是macos,docker是docker-desktop 拉取镜像 docker pull bitnami/elasticsearch 启动docker镜像 docker create -e "discovery.typesingle-node" \ --name elasticsearch1 -p 9200:9200 -p 9300:9300 \ bitnami/elasticsearch:8.17.1 测试是否好…...

【论文阅读】On the Security of “VOSA“
On the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的攻击 论文…...
【明日方舟 × 红黑树】干员调度如何不掉线?算法工程的平衡魔法全揭秘!
【明日方舟 红黑树】干员调度如何不掉线?算法工程的平衡魔法全揭秘! 作者:星之辰 标签:#红黑树 #明日方舟 #工程平衡树 #算法科普 #动态数据结构 引子:为什么你的干员调度能实时平衡,从不崩盘?…...
利用Pandas AI完成Excel大模型的结合实现自然语言问数
需求说明 实现对Excel工具的自然语言问数,即可以通过界面上传Excel文件,然后在文本框里通过语言对话的形式问出要统计的内容。比如: 用户数有多少? 语文成绩低于90的用户有多少? ..... 实现思路 Pandas AI是基于…...
在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法
今天遇到在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本却不成功失败的问题,踩坑了很长时间 记录下我的解决方法 原来我的定时任务填写方式: [roottao ~]# crontab -l */10 * * * * /bin/sh /search/index.sh >>/dev/null 2&g…...
【学习记录】如何使用 Python 提取 PDF 文件中的内容
如何使用 Python 提取 PDF 文件中的内容 在文档自动化处理、数据提取和信息分析等任务中,从 PDF 文件中提取文本是一项常见需求。PDF 文件通常分为两种类型:基于文本的 PDF 和 包含扫描图像的 PDF。 本文将介绍如何使用 Python 分别提取这两种类型的 P…...
Rust 学习笔记:使用自定义命令扩展 Cargo
Rust 学习笔记:使用自定义命令扩展 Cargo Rust 学习笔记:使用自定义命令扩展 Cargo Rust 学习笔记:使用自定义命令扩展 Cargo Cargo 支持通过 $PATH 中的 cargo-something 形式的二进制文件拓展子命令,而无需修改 Cargo 本身。 …...
基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案
以下基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案: 基于对比学习的带钢表面缺陷分类研究 ——SimCLR与YOLOv8算法融合应用 #mermaid-svg-VqDPIOfR5WJcGtD7 {font-family:"trebuchet ms",verdana,ar…...
ps蒙版介绍
一、蒙版的类型 Photoshop中有多种蒙版类型,每种适用于不同的场景: 图层蒙版(Layer Mask) 作用:控制图层的可见性,黑色隐藏、白色显示、灰色半透明。特点:可随时编辑,适合精细调整。…...

智能标志桩图像监测装置如何守护地下电缆安全
在现代城市基础设施建设中,大量电缆、管道被埋设于地下,这虽然美化了城市景观,却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响,都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

从Copilot到Agent,AI Coding是如何进化的?
编程原本是一项具有一定门槛的技能,但借助 AI Coding 产品,新手也能写出可运行的代码,非专业人员如业务分析师、产品经理,也能在 AI 帮助下直接生成简单应用。 这一演变对软件产业产生了深远影响。当 AI 逐步参与代码生成、调试乃…...

作为过来人,浅谈一下高考、考研、读博
写在前面 由于本人正在读博,标题中的三个阶段都经历过或正在经历,本意是闲聊,也算是给将要经历的读者们做个参考、排雷。本文写于2022年,时效性略有落后,不过逻辑上还是值得大家参考,若所述存在偏颇&#…...