本文主要是介绍索引的基础知识(入门级),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 什么是索引?
- 主键索引
- 索引的优点与缺点
- 索引的分类
- 按照数据结构分类
- 按照物理存储分类
- 按照字段特性分类
- 按照字段个数分类
- 总结
前言
MySQL 的索引是面试的高频考点也是我们在日常开发中用于优化 SQL 语句性能的神器。
今天跟大家讲一讲 MySQL 的索引入门篇章。对索引的知识有大概的了解…
什么是索引?
索引就是一种可以快速查询的数据结构,在MySQL中担任着提高查询性能的角色。
打个比方:一本书的目录,通过目录我们可以快速找到这本书的第一章,第二章分别在第几页,这个目录相当于索引
主键索引
每一张表都必须有主键索引,在创建表时,如果没有主动的创建索引,存储引擎 Innodb 会选择一个唯一,不重复,不为空的字段作为主键索引。如果没有这个字段的话,Innodb 会创建一个隐式的自增的主键索引。
索引的优点与缺点
优点:索引可以提高性能的查询。提高SQL性能
缺点:索引不是越多越多,当执行更新SQL语句时,索引也会动态的改变。这会拉慢更新的性能。
而且索引是占用物理存储空间的,所以索引是会造成空间的使用加大。
索引的分类
索引可以按照数据结构、字段特性、字段个数、物理存储进行分类。
按照数据结构分类
索引的数据结构有Hash,B 树,B+树,RTree 等等,目前 Innodb 存储引擎默认的索引结构是 B+ 树。存储引擎的基础知识可以看往期文章(MySQL 的存储引擎)。
为什么 Innodb 要选择 B+ 树当做默认的存储引擎呢?
B+树是 B 树的一种变异树,B 是 balance 平衡的意思。
我们来看一看B+树与B树的区别就知道为什么选择 B+ 树作为存储引擎的索引结构了。
-
B+ 树只有叶子节点是存放索引(Key)跟数据(Data)的,其他节点都是存放索引。而B树的所有节点都存放索引(Key)跟数据(Data)。 使用 B+ 时的结构更利于查询。
-
B+ 树的叶子节点之间是通过双向链表相连,可以适用于范围查询。而 B 树没有这种结构
相比之下,B+树的查询性能更加的稳定以及效率高。
按照物理存储分类
物理存储分类分为:聚簇索引(主键索引)与非聚簇索引(二级索引)。
聚簇索引:索引与数据存储在一块,在叶子节点中,key 为索引,value 为用户记录的所有数据, Innodb 默认的主键索引结构就是聚簇索引。
非聚簇索引:索引与数据分离的结构,在叶子节点中,key 为 二级索引,value 为主键索引,当我们查询的内容不是主键的话,就需要根据这个主键再去聚簇索引中查询其他数据,这样查询了两次 B + 树,就叫做**【回表】查询。如果我们查询的内容在非聚簇索引中可以找到,比如查询主键值时,这样我们只需要查询一次 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 语句进行优化,也是遵守最左匹配原则的。
总结
总的来说,索引就是一个可以实现快速查询的数据结构,优点是查询快,缺点更新慢,浪费空间,Innodb 默认的索引数据结构是B+树,索引可以按照多种特性进行分类。
我是小辉,持续分享,第二版:20240612,状态:应届找工作中。。。
这篇关于索引的基础知识(入门级)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!