最近在各种文章上都看到了各种各样类型的索引,都快把我搞懵了,什么聚集索引,主键索引,聚簇索引等等,这里来整理一下
主键索引顾名思义,就是在主键上建立的索引,InnoDB中,主键索引的数据都会存到索引树的叶子结点上,而其他索引的叶子结点存储的都是主键字段的值,因此主键索引也就是聚集索引也就是聚簇索引,因为数据都聚集在叶子节点上。
唯一索引建立在唯一约束的字段上的索引,唯一索引既可以是主键索引也可以是普通索引。
覆盖索引覆盖索引指的是要查询的数据列被所建的索引覆盖了,比如说现在有个表,主键是id,有name,age两个字段,在age上建立索引,现在执行这个语句:select id from user where age = 23; 那么就会从age字段上的索引树上找,因为age是普通索引,因此其叶子结点上存储的是主键字段的值,也就是id,因此就可以直接返回,不用回表了。要是执行的是select name from user where age = 23,就会先从age上的索引树出发,先找到age = 23锁对应的id,再去主键索引树上根据这个id找到对应的行记录返回(这就是回表)。
索引下推以上述例子,主键是id,有name,age两个字段,现在改为,有name,age,phone三个字段,以(name,age)建立联合索引,执行以下语句:select * from user where name like ‘张%’ AND age = 23; 在5.6以前,是这样执行的
需要回表两次
而有了索引下推后,就变成
只需要一次了,这种优化就叫索引下推。
再说说索引失效的几个场景吧:
- 在检索条件中没有遵循最左前缀原则,比如联合索引(name,age),而检索条件中只用了age,会导致索引失效。
- 在使用like模糊查询时,%放在了前面,比如说name like ‘%某’,也会导致索引失效。
- 在where子句中对索引字段进行运算也会导致索引失效。
- 在where子句中对索引字段进行函数运算也会导致索引失效。
- 在where子句中对索引进行!=或<>的时候有可能会导致无法使用索引
- 用or来连接也会导致索引失效
- 如果字段类型为int,而检索时加了单引号,则会隐式进行类型转换导致索引失效。



