什么是索引?索引有什么作用?
索引类似于一本书的目录,它可以提高我们的查询效率。
如果没有使用到索引,那么就会进行全表查询,如果使用了索引就会基于二分查找算法快速找到数据。索引的数据结构一般是B+Tree。
索引有哪些分类?
- 按数据结构分:B+Tree索引,Hash索引,Full-text索引
- 按物理存储分:聚簇索引(主键索引),二级索引
- 按字段特性分:主键索引,唯一索引,普通索引,前缀索引
- 按字段个数分:单列索引,联合索引
数据结构划分
物理存储分
- 主键索引它的B+tree的叶子节点存放的是一整行的数据
- 二级索引它的B+tree的叶子节点存放的是主键值
当我们查询使用了二级索引,如果我们想要查询的数据没有查到,那么就会根据二级索引查询到的主键值,再去主键索引里面去查询数据。这就是回表查询。如果我们在二级索引就可以查询到数据,我们就不需要回表。这就叫覆盖索引。
按字段特性分
字段个数分
- 单列索引,即建立在单列上的索引,比如根据name建立的索引
- 联合索引,即建立在多列上的索引,比如根基name,age建立的索引
使用联合索引时需要遵循最左匹配原则:
即最左边的列必须存在,否则索引失效。中间不能有索引跳过,否则后面的索引失效。
哪些情况会导致索引失效
6 种会发生索引失效的情况:
- 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
- 当我们在查询条件中对索引列使用函数,就会导致索引失效。
- 当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。
- MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
- 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
- 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。