mysql----索引失效

建立一张staffs表,字段id,name,age,pos。建立name、age、pos符合索引。
在这里插入图片描述

全值匹配

索引建立是按照name、age、pos顺序建立,全值匹配表示按顺序匹配查询。可以部分匹配。
在这里插入图片描述
sql查询的访问形式都是ref,且参照查询都是常数。

最佳左前缀法则

如果索引了多列,sql查询时要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。否则索引会失效。
在这里插入图片描述
注意:
(1) and 忽略左右关系。既即使没有按顺序 由于优化器的存在,会自动优化。
(2)当使用覆盖索引的方式时,(select name/age/id from staffs where age=10 (后面没有其他没有索引的字段条件)),即使不是以 name 开头,也会使用 idx_nameAge 索引。

不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

在这里插入图片描述

存储引擎不能使用索引中范围条件右边的列

在这里插入图片描述
注意:范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)

尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

在这里插入图片描述

使用不等于(!=或者<>)的时候无法使用索引导致全表扫描

在这里插入图片描述

is null 和 is not null也无法使用索引

在这里插入图片描述

like一通配符开头(’%abc’)索引失效变成全表扫描

在这里插入图片描述
注意:%加在后面,索引不失效,但是查询不到数据或者没有意义。
案例:实际开发中,必须用 ‘%abc%’,怎么解决索引失效问题?
解决:使用覆盖索引。
未创建索引:
在这里插入图片描述
创建索引后:
CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age);
在这里插入图片描述

字符串不加单引号索引失效

mysql会隐式的将整形转换为所需的字符型。

少用or它用来连接时会索引失效

猜你喜欢

转载自blog.csdn.net/qq_40927884/article/details/90084237