MySQL 索引知识梳理

102 阅读3分钟

1、如何解释索引呢?

简单来说就是一种加快查询的排序数据结构

书(字典)中的目录,就是充当索引的角色,方便我们快速查找书中的内容,所以索引是以空间换时间的设计思想。那换到数据库中,索引的定义就是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录

2、索引的分类应该怎么分?

1.按数据结构分类的话:

可以分为

b+树索引,hash索引,r 树索引还有full text 索引

比较最为常用的就是b+ 树索引;

2.从索引的类型分类的话:

可以分为联合索引和单一索引

其中单一索引又分为主键索引,唯一索引,普通索引和全文索引;

image.png

3.站在innodb引擎下:

可以分为聚集索引和二级索引 

所谓的聚集索引,就是站在我们b+ 树的结构下形成了一种索引,将数据存储和索引放在一起,叶子节点存放的是完整的行数据;

而二级所应则是将索引字段和对应的主键id存在在叶子节点;这种结构也导致了二级索引往往需要查询到主键id之后,再回到聚集索引去获取完整的行信息,这个过程也叫做回表

image.png

3、索引的使用要注意什么?

在我们实际的开发过程中,如何使用不当也会导致我们的索引失效,进而去进行全表扫描;

常见的索引失效的场景有以下几个:

● 1 在like 的模糊查询中,% 出现在首位,这样会导致索引失效 ;

● 2 在查询条件中使用了or 也会导致索引失效; 

● 3 在 查询 字符串类型的时候,没用加上引号 ;

● 4 使用索引的字段去进行函数的计算,也会导致失效;

● 5 在使用联合索引的时候,没用按照最左前缀的原则,进而导致索引失效 。

这里我再说说联合索引的最左前缀,我现在有一张学生信息表,我对其姓名,年龄,身高,这三个字段组成了联合索引,其实底层就相当于创建了三个索引,分别是 姓名,姓名 年龄 ,姓名 年龄 身高 ,这就意味着在使用的使用,如果只用了 年龄 ,身高等单一字段,就不会生效,想要这个联合索引生效就要使用了上面三种其中的一种,才会生效

但是在我们mysql 版本不断迭代升级,现在我们的8.版本以及增加了一种机制,叫做索引跳跃式扫描,他的作用就是在你没用使用到前缀字段的时候,在执行的时候自动给你加上

比如此时通过(A、B、C)三个列建立了一个联合索引,此时有如下一条SQL

SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx`;

按理来说,这条SQL既不符合最左前缀原则,也不具备使用索引覆盖的条件,因此绝对是不会走联合索引查询的

但是优化器为你重构了SQL,比如上述这条SQL则会重构成如下情况:

SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx`
UNION ALL
SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx` AND A = "yyy"
......
SELECT * FROM `tb_xx` WHERE B = `xxx` AND C = `xxx` AND A = "zzz";

其实也就是MySQL优化器会自动对联合索引中的第一个字段的值去重,然后基于去重后的值全部拼接起来查一遍