目录
1.不遵循最左前缀原则
2.在索引列上使用(计算,函数,or,类型转换),都是导致失效而导致全表扫描
3.范围查询
4.Select * 导致回表查询
5.不等空值还有or导致索引失效
6.like %写在左边导致索引失效
7.字符串不加单引号也会导致索引失效
Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
下面的所以都是以复合索引(b,c,d)为前提
1.不遵循最左前缀原则
EXPLAIN SELECT * FROM ind WHERE c=3 AND d=4 AND b=2
EXPLAIN SELECT * FROM ind WHERE d=4 AND c=3 AND b=2
这两个都会生效,因为Mysq底层会优化为最适合的sql
EXPLAIN SELECT * FROM ind WHERE b=2 AND d=5
也会生效
EXPLAIN SELECT * FROM ind WHERE c=3 AND d=2
索引失效,原因是少了b索引,
总结:使用联合索引,只要最左边的索引还在,那索引就不会失效,
如果少了中间的,那么只会生效左边的,
2.在索引列上使用(计算,函数,or,类型转换),都是导致失效而导致全表扫描
使用索引得保证有序性,一旦使用了计算,函数,就会不可避免依次进行计算,也就会全表扫描
3.范围查询
当联合查询使用了范围查询,那么右边的字段就会失效
EXPLAIN SELECT * FROM ind WHERE b=2 AND c>3 AND d=5
EXPLAIN SELECT * FROM ind WHERE b>2 AND c=3 AND d=5
可以看到,当最左边的索引使用范围查询时,右边的索引全部会失效
4.Select * 导致回表查询
聚簇索引和非聚簇索引,
聚簇索引的B+树子节点包含主键和所有数据
非聚簇索引的B+树子节点包含索引和主键
覆盖索引就是在返回的字段中包含非索引字段会导致,当查询不到想要的字段就会去聚簇索引里面找数据,
在返回列里需要什么字段就写什么字段,最好与查询的条件相符,就是走覆盖查询
5.不等空值还有or导致索引失效
!= ,is null ,or都会导致索引失效,全表扫描
6.like %写在左边导致索引失效
like "%张"会导致索引失效,
会根据首字母来排序进行查询
7.字符串不加单引号也会导致索引失效
隐式转换
会对每一个都进行转换
而如果是 int类型加上了单引号,会自动转换为数字类型,不会导致索引失效
EXPLAIN SELECT * FROM ind WHERE b='2'