MySQL 之索引详解

想象一下,你正在图书馆寻找一本关于 MySQL 索引的书。图书馆里有成千上万本书,但没有目录。你只能一排一排、一本一本地找,直到找到你想要的书。这将会花费大量的时间!数据库索引就像图书馆的目录一样,可以帮助数据库系统快速定位到所需数据,从而大大提高查询速度。

1. 索引基础:概念与类型

1.1 什么是索引?

索引是一种特殊的数据结构,它存储了表中一列或多列的值以及对应行的物理地址。当数据库执行查询时,会首先在索引中查找符合条件的记录地址,然后再根据地址直接访问数据行,从而避免了全表扫描,提高了查询效率。

示例:

假设我们有一个名为 users 的表,包含以下数据:

idnameemail
1张三zhangsan@example.com
2李四lisi@example.com
3王五wangwu@example.com

如果我们在 name 列上创建索引,数据库就会创建一个索引结构,其中包含 name 列的值和对应行的 id:

nameid
张三1
李四2
王五3

当我们执行查询 SELECT * FROM users WHERE name = '李四' 时,数据库会首先在索引中找到 name 为 '李四' 的记录,然后直接访问 id 为 2 的行,而不需要扫描整个 users 表。

1.2 常见的索引类型

MySQL 支持多种类型的索引,常见的包括:

  • 主键索引 (PRIMARY KEY): 唯一标识表中每一行的索引,一个表只能有一个主键索引,主键索引的值不能为空。

  • 唯一索引 (UNIQUE): 唯一索引保证索引列的值是唯一的,可以有多个唯一索引,允许为空值(但只允许一个空值)。

  • 普通索引 (INDEX): 最基本的索引类型,没有任何限制,用于加速查询速度。

  • 全文索引 (FULLTEXT): 用于在文本字段中进行全文搜索,主要用于 MyISAM 引擎。

2. 索引的利与弊

优点:

  • 大大加快数据的检索速度,这是创建索引的最主要原因。

  • 加速表之间的连接,特别是在实现数据的参考完整性方面特别有用。

  • 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

  • 创建和维护索引需要耗费时间,而且随着数据量的增加而增加。

  • 索引需要占用物理空间,如果要建立索引的列数据量很大,那么需要的存储空间也会很大。

  • 当对表中的数据进行修改时,比如添加、删除和修改,索引也需要动态地维护,降低了数据的维护速度。

3. 索引操作:创建与删除

创建索引:

可以使用 CREATE INDEX 或 ALTER TABLE 语句来创建索引:

  • CREATE INDEX:

CREATE INDEX index_name ON table_name (column_name);

示例:

CREATE INDEX idx_name ON users (name);
  • ALTER TABLE:

ALTER TABLE table_name ADD INDEX index_name (column_name);

示例:

ALTER TABLE users ADD INDEX idx_email (email);

删除索引:

可以使用 DROP INDEX 或 ALTER TABLE 语句来删除索引:

  • DROP INDEX:

DROP INDEX index_name ON table_name;

示例:

DROP INDEX idx_name ON users;
  • ALTER TABLE:

ALTER TABLE table_name DROP INDEX index_name;

示例:

ALTER TABLE users DROP INDEX idx_email;

4. 深入底层:数据结构与性能对比

前面我们已经了解了索引的基本概念,现在让我们更深入地探讨 MySQL 索引的底层实现原理,以及使用索引和不使用索引在性能上的巨大差异。

4.1 索引的数据结构

MySQL 索引的底层数据结构主要有两种:B+Tree(多路平衡搜索树) 和 哈希表。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。

  • B+ 树 是一种多路平衡查找树,它将所有数据存储在叶子节点,非叶子节点只存储索引值和指向子节点的指针。所有叶子节点通过链表连接,方便范围查询,并且每个节点可以存储多个索引值,降低树的高度,减少 I/O 次数, 使其成为 MySQL 索引最常用的数据结构。

  • 哈希表 是一种键值对存储结构,它通过哈希函数将索引值映射到哈希表中的一个位置,从而实现快速查找。哈希表适用于等值查询,例如 WHERE name = '张三',但不适用于范围查询。MySQL 中,Memory 存储引擎默认使用哈希索引,而 InnoDB 存储引擎默认使用 B+ 树索引。

B + Tree(多路平衡搜索树)结构介绍,如图所示:

B+Tree结构:

  • 每一个节点,可以存储多个key(有n个key,就有n个指针)

  • 节点分为:叶子节点、非叶子节点

    • 叶子节点,就是最后一层子节点,所有的数据都存储在叶子节点上

    • 非叶子节点,不是树结构最下面的节点,用于索引数据,存储的的是:key+指针

  • 为了提高范围查询效率,叶子节点形成了一个双向链表,便于数据的排序及区间范围查询

4.2 使用索引和不使用索引的性能差异

为了更好地理解使用索引带来的性能提升,我们来看一个具体的例子。

假设我们有一个包含 100 万条数据的 users 表,其中 name 列没有创建索引。

场景一:不使用索引

SELECT * FROM users WHERE name = '张三';

当执行这条 SQL 语句时,MySQL 数据库需要遍历整个 users 表,逐行比较 name 列的值是否等于 '张三',直到找到匹配的行。这种方式被称为全表扫描,效率非常低下,尤其是在数据量非常大的情况下。

场景二:使用索引

CREATE INDEX idx_name ON users (name);

SELECT * FROM users WHERE name = '张三';

当我们在 name 列上创建了索引之后,再次执行相同的查询语句,MySQL 数据库会直接使用索引进行查找。由于 B+ 树的特性,查找速度非常快,只需要很少的 I/O 操作就可以定位到目标数据。

总结:

使用索引可以避免全表扫描,大大提高查询效率,尤其是在数据量非常大的情况下。

5. 索引失效:问题与解决

虽然索引可以提高查询效率,但在某些情况下,索引可能会失效,导致 MySQL 数据库无法使用索引进行查询,从而进行全表扫描。

常见的索引失效的情况包括:

  • 未使用索引列进行查询: 比如在 WHERE 子句中使用了非索引列进行过滤。

  • 对索引列进行了函数操作: 比如在 WHERE 子句中对索引列使用了函数操作,如 SUBSTR、DATE 等。

  • 使用了 LIKE 模糊查询,且通配符 % 位于开头: 比如 WHERE name LIKE '%三'。

  • 使用了 OR 连接条件,且其中一个条件没有使用索引: 比如 WHERE name = '张三' OR age = 18,如果 age 列没有创建索引,那么整个查询将无法使用索引。

  • 数据分布不均: 如果索引列的数据分布非常不均匀,比如大部分数据的索引列值都相同,那么索引的效率也会降低。

6. 总结

索引是 MySQL 数据库中非常重要的一个概念,合理地使用索引可以大大提高数据库的查询效率。在设计和使用索引时,需要根据实际情况选择合适的索引类型,并尽量避免索引失效的情况。

以上就是关于数据库中索引的相关知识,希望对各位看官有所帮助,下期见,谢谢~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

raylib实现生产者消费者模型增加缓冲提高帧率

原来增加了四叉树导致帧率下降 后来学了生产者消费者模型&#xff0c;尝试追加缓冲池&#xff0c;剥离主函数查找需要更新的数据 帧率上升稳定到60帧 多了10 帧 中间工程主要是探索数据结构体怎么安排 // 参考自 https://zhuanlan.zhihu.com/p/693482704 #include <stdio.…

Linux之我不会

一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…

Type-C接口相关知识:【总结大全】

Type-c现在非常通用了&#xff0c;所以了解Type-c也变得十分有必要了&#xff0c;还是秉承了解就要了解清楚的原则&#xff0c;我们深入的看看Type-c接口。 Type-c主要是取代上一代Micro usb接口&#xff0c;那么Type-c有什么优点呢&#xff1f; 正反可插&#xff0c;使用时不…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

Xcode报错:The request was denied by service delegate (SBMainWorkspace)

Xcode报错&#xff1a;The request was denied by service delegate (SBMainWorkspace) 造成的原因: &#xff08;1&#xff09;新的M2芯片的Mac电脑 (2) 此电脑首次安装启动Xcode的应用程序 (3&#xff09;此电脑未安装Rosetta 解决方法: &#xff08;1&#xff09;打开终端…

传奇GEE引擎版本如何封挂?GEE引擎设置简单的封挂脚本教程

网关参数设置gee引擎封挂脚本 1、打开M2-选项-参数设置-游戏速度 把所有的设置限速关闭 2、打开M2-选项-客户端设置-内挂控制-速度控制&#xff1a;移动速度 攻击速度 魔法速度 设置好参数&#xff0c;一旦设置不要修改 否则封挂网关参数需重新设置 打开M2-选项-功能设置-…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

二、kafka生产与消费全流程

一、使用java代码生产、消费消息 1、生产者 package com.allwe.client.simple;import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.pr…

单通道串口服务器

型号&#xff1a; SG-TCP232-110 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口&#xff0c;两个接口内部连接&#xff0c;同时只能使用一个口工作。 设备…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中&#xff0c;SEMCMS_Images.php的search参数&#xff0c;以及SEMCMS_Products.php的search参数&#xff0c;存在sql注入漏洞。 &#xff08;这个之前就有两个sql的cve&#xff0c;这次属于是捡漏了&#x1f6…

Linux环境下安装python

Linux 环境下安装python 以下是在Linux环境下安装Python - 3.9.4.tgz的详细步骤&#xff1a;1. 下载Python - 3.9.4.tgz&#xff08;如果未下载&#xff09;2.解压文件3.安装依赖项&#xff08;如果需要&#xff09;4.配置和编译5.安装6.创建一个别名&#xff08;alias&#xf…

Sql Developer日期显示格式设置

默认时间格式显示 设置时间格式&#xff1a;工具->首选项->数据库->NLS->日期格式: DD-MON-RR 修改为: YYYY-MM-DD HH24:MI:SS 设置完格式显示&#xff1a;

JavaEE: 深入探索TCP网络编程的奇妙世界(四)

文章目录 TCP核心机制TCP核心机制四: 滑动窗口为啥要使用滑动窗口?滑动窗口介绍滑动窗口出现丢包咋办? TCP核心机制五: 流量控制 TCP核心机制 上一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(三) 书接上文~ TCP核心机制四: 滑动窗口 为啥要使用滑动窗口? 之前我们讨…

计算机网络--HTTP协议

1.TCP,UDP的对比图 TCP:面向连接的,可靠的,字节流服务; UDP:无连接的,不可靠的,数据报服务; 2.补充网络部分的其他知识点 1).复位报文段 在某些特殊条件下&#xff0c; TCP 连接的一端会向另一端发送携带 RST 标志的报文段&#xff0c;即复位报文段&#xff0c;已通知对方…

大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

视觉分析在垃圾检测中的应用

随着城市化进程的加快&#xff0c;垃圾管理成为现代城市面临的重大挑战。有效的垃圾识别和分类不仅能提升环境保护的效率&#xff0c;还能减少资源浪费。基于视觉分析的垃圾识别算法应运而生&#xff0c;为解决这一问题提供了技术支持。 垃圾识别算法的技术实现主要依赖于深度学…

002、视频格式转换

下载地址 http://www.pcfreetime.com/formatfactory/CN/index.html

【C++进阶】AVL树的介绍及实现

【C进阶】AVL树的介绍及实现 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. AVL的介绍 2. AVL树的实现 2.1 AVL树的结构 2.2 AVL树的插入 2.2.1 插入一个值的大概过程 2.2.2 …

2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡

考前练习 2024年03月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 2024年06月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 知识点描述 …

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况&#xff0c;而本道题是出现两个单身狗的情况。根据一个数…