【MySQL】索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 在SQL语句中,使用查询操作的频率比增删改的操作高.而在实际开发中,一张数据库表中的数据是很多的.想要快速查询出想要的数据效率是很低的.因此为了提高查询效率,所以就有了"索引"这个概念.

1. 前言

在SQL语句中,使用查询操作的频率比增删改的操作高.而在实际开发中,一张数据库表中的数据是很多的.想要快速查询出想要的数据效率是很低的.因此为了提高查询效率,所以就有了"索引"这个概念.


2. 索引的简介

“索引"可以理解为书/文章的目录,我们可通过目录快速找到我们想要找到的内容,但是如果没有目录,我们就得从头开始看.直到找到我们的

在算法中,有一个常见的操作是"用空间换时间”.顾名思义就是牺牲更多的空间来使时间复杂度变低."索引"也是如此, 使用"索引"有两个代价:1.使用索引会消耗更多的空间 2.虽然提高了查询的数据,但是降低了增删改的效率. 即使"索引"有弊端,但是我们仍然会使用"索引",因为通常认为查询操作比增删改的使用频率高


3. 查看索引

show index from 表名;

show index from 表名;

ee850ac4d0374145a0e4fd54243fe1f5.png



我这里有一个"索引",是使用主键约束自带的一个索引


4. 创建索引

create [UNIQUE|FULLTEXT] index 索引名 on 表名(字段,...);
# []中的是可选项
# UNIQUE: 唯一索引
# FULLTEXT: 全文索引

一个索引可以关联多个字段,如果一个索引只关联一个字段,那么这个索引叫"单列索引",如果一个索引关联多个字段,那么这个索引也称"联合索引"


示例:


819d2ce89da346c0b27e43d385bcf240.png


可以看到刚开始的时候student这个表并没有"索引",后面我给student这个表中的"name"这一列创建了索引.


注意: 创建"索引" 也是一个低效操作,如果表中的数据多,创建索引就可能会非常耗时+带来大量的硬盘IO,从而导致数据库卡死.


5. 删除索引

drop index 索引名 on 表名;

示例:


2d005a067bc54c2b81df7c9a56af1692.png


删除索引和创建索引类似,也是低效操作.一般建议在建表的时候就创建好"索引"


6. 索引底层的数据结构

前面说到"索引"可以提高查询的效率,在我们学习常见的数据结构中可以提高查找效率的有二叉搜索树(二叉排序树)和哈希表. 但是这两种数据结构都不太适合做数据库的索引,当然也是有用哈希表作为索引的数据结构的.

原因:


虽然哈希表的增删改查的时间复杂度都是O(1),但也只是值相等的情况下,如果涉及到比较的操作,那么哈希表就无能为力了.

而二叉搜索树的查询速度在最坏的情况下是O(n).虽然后面有了AVL树和红黑树(比较平衡的二叉搜索树),此时的查找的效率是O(logn).如果数据库中的数据非常多,那么二叉搜索树的高度就会非常高.而二叉搜索树的高度是和比较次数呈正相关的.而进行比较操作是需要读硬盘的,这个就有点吃不消了.

数据库的索引中最常用的数据结构是 B+树,而且MySQL默认的存储引擎InnoDB也是以B+树作为索引的数据结构.,不过想要认识B+树,要先认识B树(B-树).


6.1 B树

B树(B-tree)是一种自平衡的树形数据结构,常用于数据库和文件系统中进行数据的存储和查找。B树的特点是可以存储大量的数据,而且查找、插入、删除等操作的时间复杂度都是O(log n),其中n是数据的总数。


B树示例图:

d4e898e5da8b4350b5ee45cc1996b931.png



B树的结构类似于二叉搜索树(N叉搜索树),但每个节点可以有多个子节点。B树的节点通常包含多个关键字和对应的指针,关键字按照大小顺序排列,指针指向子节点或数据。


B树的自平衡性质是通过节点的分裂和合并来实现的。当一个节点中的关键字数量超过了指定的阈值时,就会进行分裂,将一部分关键字和指针移到新的节点中。当一个节点中的关键字数量低于指定的阈值时,就会进行合并,将相邻的节点合并成一个节点。


B树相对于普通的二叉搜索树来说有以下几个优点:


1.减少磁盘I/O操作:B树是一种多路搜索树,每个节点可以存储多个关键字和指针,因此可以减少磁盘I/O操作次数,提高数据访问效率。


2.更适合外部存储:B树的节点大小通常与磁盘块大小相同,因此可以更好地利用外部存储设备的特点,提高数据存储和访问效率。


3.平衡性更好:B树的每个节点都有多个子节点,因此树的高度相对较小,树的平衡性更好,查询效率更高。


4.更适合大规模数据:B树可以存储大量的数据,因此更适合处理大规模数据。


B树的不足: B树在查找元素的时候只适合 定值查找(查找一个固定的值),而不是和范围查找.为了解决这个问题,因此就有了B+树.


6.2 B+树

B+树是一种平衡树,常用于数据库和文件系统中的索引结构。它的特点是每个节点可以存储多个关键字和对应的数据指针,而且所有关键字都在叶子节点上出现,非叶子节点只存储关键字和指向子节点的指针。B+树的叶子节点形成了一个有序链表,可以方便地进行范围查询和遍历。B+树的插入、删除和查找操作的时间复杂度都是O(log n),因此它是一种高效的数据结构。


B+树示例图:


B+树和B树的差异在于以下几点:


1.有k个孩子的节点就有k个关键字。也就是孩子数量=关键字数,而B树中,孩子数量=关键字数+1。

2.非叶子节点的关键字也会同时存在在子节点中,并且是在子节点中所有关键字的最大(或最小)。

3.非叶子节点仅用于索引, 不保存数据记录,跟记录有关的信息都放在叶子节点中。而B树中,非叶子节点既

保存索引,也保存数据记录。

4.所有关键字都在叶子节点出现,叶子节点构成一个有序链表,而且叶子节点本身按照关键字的大小从小到大

顺序链接。

而在MySQL索引是对原有的B+树进行了优化,原本的B+树最下面的叶子就只是一个单向不循环链表,而MySQL索引中的B+树则是一个双向循环链表.

如图所示:


405cd6358e7b46d2817fb806b4809132.png


B+树的叶子结点就是全部的数据,用双向循环链表进行保存,此时就非常容易范围查找了, 只需取一段子链表即可.


正因为叶子节点是全集数据,只需要把每一行(每一条记录的完整的所有列关联到叶子节点上即可),非叶子节点,只需要保存索引列(只存个id),因此非叶子结点占用的空间很小,就可以在内存中缓存. 从而进一步减少硬盘I/O


B+树相对于B树主要有以下几个优点:


1.更适合磁盘存储:B+树的内部节点只存储键值信息,而不存储数据信息,所有数据都存储在叶子节点中。这样可以使得每个节点存储更多的键值信息,从而减少树的高度,减少磁盘I/O次数,提高查询效率。


2.更适合范围查询:由于B+树的所有数据都存储在叶子节点中,而且叶子节点之间有指针相连,因此B+树更适合范围查询。例如,如果要查询某个范围内的数据,只需要找到最小值和最大值所在的叶子节点,然后沿着指针遍历即可。


3.更适合顺序访问:由于B+树的所有数据都存储在叶子节点中,而且叶子节点之间有指针相连,因此B+树更适合顺序访问。例如,如果要对数据进行排序,只需要按照叶子节点的顺序遍历即可。


4.更适合并发访问:由于B+树的所有数据都存储在叶子节点中,而且叶子节点之间有指针相连,因此B+树更适合并发访问。例如,如果多个线程同时查询不同的数据,只需要访问不同的叶子节点即可,不会出现锁竞争的情况。


7.索引的分类


image.png

image.png

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:


image.png

image.png

聚集索引选取规则:


如果存在主键,主键索引就是聚集索引。

如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

ps: 聚集索引和二级索引在SQL优化中十分重要.


8.总结

索引在MySQL中非常重要,B树和B+树的区别,MySQL为什么使用B+树作为索引的数据结构等也是很常见的面试问题.对于这些问题要能够熟练掌握.


感谢你的观看!希望这篇文章能帮到你!

专栏:《速通MySQL》在不断更新中,欢迎订阅!

“愿与君共勉,携手共进!”

8fbf2a7f2d0e4db782e58035677a303d.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
6天前
|
存储 关系型数据库 MySQL
MySQL底层概述—6.索引原理
本文详细回顾了:索引原理、二叉查找树、平衡二叉树(AVL树)、红黑树、B-Tree、B+Tree、Hash索引、聚簇索引与非聚簇索引。
MySQL底层概述—6.索引原理
|
8天前
|
SQL 存储 关系型数据库
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
MySQL原理简介—9.MySQL索引原理
|
25天前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
101 13
|
28天前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
|
1月前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
115 22
 MySQL秘籍之索引与查询优化实战指南
|
1月前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
134 10
|
2月前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
2月前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
78 8
|
2月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
358 9