前言
MySQL 的索引是面试的高频考点也是我们在日常开发中用于优化 SQL 语句性能的神器。
今天跟大家讲一讲 MySQL 的索引入门篇章。对索引的知识有大概的了解…
什么是索引?
索引就是一种可以快速查询的数据结构,在MySQL中担任着提高查询性能的角色。
打个比方:一本书的目录,通过目录我们可以快速找到这本书的第一章,第二章分别在第几页,这个目录相当于索引
索引的特点
在创建表时,如果没有主动的创建索引,存储引擎 Innodb 会选择一个唯一,不重复,不为空的字段作为主键索引。如果没有这个字段的话,Innodb 会创建一个隐式的自增的索引。
索引的优点与缺点
优点:索引可以提高性能的查询。提高SQL性能
缺点:索引不是越多越多,当执行更新SQL语句时,索引也会动态的改变。这会拉慢更新的性能。
而且索引是占用物理存储空间的,所以索引是会造成空间的使用加大。
索引的分类
索引可以按照数据结构、字段特性、字段个数、物理存储进行分类。
按照数据结构分类
索引的数据结构有Hash,B 树,B+树,RTree 等等,目前 Innodb 存储引擎默认的索引结构是B+树。存储引擎的基础知识可以看往期文章(MySQL 的存储引擎)。
为什么 Innodb 要选择 B+ 树当做默认的存储引擎呢?
B+树是 B 树的一种变异树,B 是 balance平衡的意思。
我们来看一看B+树与B树的区别就知道为什么选择B+树作为存储引擎的索引结构了。
1.B+树只有叶子节点是存放索引(Key)跟数据(Data)的,其他节点都是存放索引。而B树的所有节点都存放索引(Key)跟数据(Data)。
2. B+树的叶子节点是类似于双向链表,可以适用于范围查询。而 B 树没有这种结构
相比之下,B+树的查询性能更加的稳定以及效率高。
按照物理存储分类
物理存储分类分为:聚簇索引(主键索引)与非聚簇索引(二级索引)。
聚簇索引:索引与数据存储在一块,比如Innodb默认的主键索引结构就是聚簇索引。
非聚簇索引:索引与数据分离的结构,这样会出现二次查询,也就是回表。比如 Mylsam 使用的是非聚簇索引。
这里讲一下,Innodb 与 Mylsam 的默认的索引的数据结构都是B+树,但是两者各有不同。
按照字段特性分类
按照字段特性分类:主键索引,唯一索引,普通索引,前缀索引
主键索引:不为空,不可重复。Innodb 默认一定会创建。
唯一索引:不为空,不可重复。一般会用于增加查询性能。
普通索引:可以为空,可重复,一般会用于增加查询性能。
前缀索引:一般是varchar等字符串值时,可以字符串缩减成前几个字符当做索引。
按照字段个数分类
按照字段个数分类:单一索引与联合索引
单一索引:一个字段当做一个索引,其中唯一索引,普通索引等等都是单一索引。
联合索引:多个字段组成一个索引,如果你一个表需要建立多个索引,建议使用联合索引。
联合索引存在最左匹配原则,也就是当(a,b,c)是一个联合索引时,你使用索引字段来当做条件查询时要遵循从左到右的使用,不然会索引失效。
打个比方
- 当where a = 1 索引生效
- 当where a = 1 and b = 2 索引生效
- 当where b = 2 and c = 3 索引失效
而 - 当where b = 1 and a = 2 索引生效
由上可以看出,联合索引必须要从左到右的使用即遵循最左匹配原则才能生效。为什么第四种当where b = 1 and a = 2 索引生效是生效的呢,因为SQL语句执行查询时会有优化器,优化器将SQL语句进行优化,将 a 放在 b 前面。
总结
总的来说,索引就是一个可以实现快速查询的数据结构,优点是查询快,更新慢,浪费空间,Innodb 默认的索引数据结构是B+树,索引可以按照多种特性进行分类。
有启发点个赞 🌹
好文章不要错过,最近給大家分享的文章
1.MySQL的基础架构
2.SQL语句的执行流程
3.MySQL 的存储引擎
预计下篇分享:MySQL 索引进阶(查漏补缺)
本篇参考:小林coding ,JavaGuide
我是小辉,正在进行 Java 实习的 24 届应届毕业生。欢迎关注,持续分享,包括但不限于技术文章。全网同名…