MySQL索引:让你的数据库查询快到起飞!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL索引

💕世界上最美好的东西之一,就是你每天都有机会开始全新的一天。💕
🐼作者:不能再留遗憾了🐼
🎆专栏:MySQL学习🎆
🚗本文章主要内容:详细介绍如何查看、创建和删除MySQL索引,以及MySQL索引的底层原理:B+树。🚗
在这里插入图片描述

前言

各位朋友们,大家好!前面我们已经介绍了MySQL的库和表操作,今天我将为大家分享使数据库查询更加高效的MySQL索引,如果大家觉得博主的文章对你有用的话,记得点个赞哦!😘

什么是MySQL索引

MySQL索引是一种用于加速对MySQL数据库表中数据的查找的数据结构。它可以帮助MySQL数据库在查询时快速定位到所需数据,从而提高查询效率。

MySQL索引基于数据表的某一列或多列创建,并按照一定的算法进行排序存储,以快速地返回符合条件的数据。通常情况下,索引可以被创建在表的主键列、唯一约束列、普通列上,其中主键和唯一约束列上的索引是最常用的。

使用索引可以有效地加快查询操作的速度,但也会增加写操作的开销。因此,在创建索引时需要根据实际情况进行权衡考虑。

MySQL索引的作用

1.提高查询速度:索引可以加速MySQL数据库执行SELECT查询语句的速度。MySQL在查询时可以利用索引直接定位到所需的数据行,而不必遍历整个数据表。

2.保证数据的唯一性:在MySQL数据库中,主键或唯一约束列上的索引能够保证数据的唯一性,避免重复数据的出现。

3.提高排序速度:当对某一个列进行ORDER BY操作时,MySQL可以利用索引进行快速排序,避免在内存中执行排序操作所造成的效率低下。

4.加速数据表的连接:当数据表之间进行JOIN操作时,MySQL可以利用索引快速定位所需数据,并将其连接成需要的结果。

MySQL索引适合在哪些场景下使用

因为MySQL索引虽然提高了查询的效率,但是也需要付出一定的代价。

1.需要付出额外的空间代价来保存索引数据
2.索引可能会拖慢新增、删除、修改的速度

MySQL索引通常在一下场景下使用:

1.经常查询的列:如果一个列经常被用于 SELECT 或 WHERE,那么它应该被索引。这种情况下,索引可以大大提高查询的性能。

2.唯一性列:主键、唯一性约束条件和外键都应该创建索引,这可以确保数据表的数据唯一性,并保证数据表间连接的性能。

3.经常连接的表:如果两个或多个表经常出现在 JOIN 语句中,那么创建这些表之间连接所需的列上的索引,可以大大提高查询的性能。

4.经常排序的列: 如果一个数据表中的某个列经常出现在 ORDER BY 子句中,那么索引可以大大提高排序操作的速度。

5.经常分组的列: 如果一个数据表中的某个列经常用于聚合操作(如SUM、COUNT、AVG等),那么索引可以大大提高聚合操作的性能。

如何使用MySQL索引

查看索引

show index from 表名

在这里插入图片描述
每一列所表示的含义:

Table:索引所属的数据表名。
Non_unique:这个索引是否是唯一索引。如果值为0,表示是唯一索引;如果值为1,表示非唯一索引。
Key_name:索引的名称。
Seq_in_index:索引中字段的位置。索引可以涉及到多个字段,这个字段标识了当前字段在索引中的位置。
Column_name:索引所在的列名。
Collation:索引的字符集。
Cardinality:索引中的唯一值的数量。
Sub_part:索引使用的列的前缀长度。
Packed:索引是否使用压缩。
Null:索引是否可以插入空值。
Index_type:索引的类型,可能是BTREE、HASH、FULLTEXT等。
Comment:关于索引的一些注释信息。

创建索引

create index 索引名 on 表名(列名);

查看表结构

desc student;

在这里插入图片描述
创建索引并查看

create index index_sn on student(sn);
show index from student;

在这里插入图片描述

删除索引

drop index 索引名 on 表名
drop index index_sn on student;
show index from student;

在这里插入图片描述

MySQL索引的底层结构

MySQL索引的底层结构不是二叉搜索树和哈希表,而是B+树。说到B+树,大家可能都知道还有一个B树,B+树是在B树的基础上发展来的。

B树

🎁B树是一种多路查找树,用于在大小可变的文件中进行查找和排序。B树通常被用来实现数据库或文件系统中的数据结构,它具有平衡读写性能、支持数据的动态更新和查询复杂度低等优点。
🙌B树的基本思想是将关键字和数据元素按序存储在树的结点中,并按特定规则组织树形结构。B树的每个结点最多可以有m个子树,若结点中存储的关键字数为n,那么该结点中应有n+1个指向子树的指针。B树的关键字按大小顺序排列,且结点中所有关键字不重复。

下面就是一个简单的B树

在这里插入图片描述

B树的特点:
1.B树可以高效地支持多路查找。通过对结点进行平衡,B树的查找性能稳定,在最坏情况下仅需要O(log n)的时间复杂度即可在树结构中查找到一个关键字。

2.B树可以高效地支持数据的动态更新和平衡。通过在插入和删除操作中对树的平衡进行自我调整,B树能够高效地对数据的动态更新进行处理。

3.B树的每个结点可以存储更多的关键字和数据元素,进而减少磁盘I/O的次数,提高整体的查找和排序性能。

B+树

B+树是一种多路查找树,是B树的一种变种。B+树与B树的主要区别是:B+树的非叶子结点只包含导航信息,不包含实际数据;B+树的关键字只出现在叶子结点中,而且叶子结点本身按关键字大小顺序存储,且相邻叶子结点通过指针连接。

在这里插入图片描述
📱B+树的特点:

1.B+树的非叶子结点不存储数据,只存储导航信息。这种设计可以使得B+树的内部结构更加紧凑,从而减少树的高度,提高查询效率。

2.B+树的所有叶子结点都包含了相同的信息,因此可以很方便地实现区间查找或范围查找。这种设计也提高了B+树的查询性能。

3.类似B树,B+树也是平衡树,每个节点内部都包含多个关键字,能够有效支持多值查找和排序。

4.B+树的叶子结点之间可以用指针串接起来,形成一个有序链表,因此可以支持快速的区间遍历和排序数据。

🏀B+树的优势:
1.更快的查找性能:B+树在非叶子节点只存储索引信息,数据都存放在叶子节点中。当进行查找时,只需要从根节点开始往下遍历,每个非叶子节点只需要加载一次就能定位到数据所在的叶子节点,从而大大提高了查询效率。

2.更高的稳定性:B+树的非叶子节点只存储索引,而数据都存放在叶子节点中。当叶子节点变化时,只会对叶子节点进行操作,而非叶子节点不会改变,这种特性大大增加了数据结构的稳定性,减少了出错率。

3.适应范围更广:B+树能够适应更广范围的磁盘IO操作,因为B+树的叶子节点都是通过链表相互连接的,能够更加快速地支持区间查找和遍历操作,适用于海量数据存储和查询场景。

4.更高的顺序访问性能:由于B+树的叶子节点是按顺序进行存储的,因此能够更加快速地进行顺序遍历操作,特别是在需要频繁进行范围查询操作的场景,能够极大地提升性能。

注意

当表中存在一个主键索引时,如果还存在另一个索引,那么还是以主键索引为主构建B+树,叶子节点组织所有的数据行,而另一个非主键索引也会额外构架一个B+树,但是这个 B+ 树的叶子节点就不再存储这一行的完整数据,而是存主键的索引,还需要通过主键 索引 去主键的 B+ 树里再查一次(查两次 B+ 树),这个过程被称为回表

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
118 9
|
1天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
39 22
 MySQL秘籍之索引与查询优化实战指南
|
2天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
21 10
|
15天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
48 8
|
18天前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
59 11
|
12天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
12天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
12天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2
|
10天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
26天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
179 15