1、不在索引列上做任何操作(计算、函数、(自动、手动)类型转换),会导致索引失效而转向全表扫描。
2、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select * 的操作。
补充:在工作过程中,一定不要使用select *的操作,尤其是大厂,会进行慢sql查询,会被要求修改。
3、mysql在使用不等于(!= 或者 <>)的时候无法使用索引而转向全表扫描。
4、is null 、is not null 也无法使用索引。
5、like以通配符开头(’%abc…’),mysql索引失效会变成全表扫描。
解决方式:如果想使用like '%abc…%'进行,模糊查询,可以采用索引覆盖方式。例如:
如上图所示:联合索引(name,status)做如下查询
模糊查询的通配符在后面,且查询字段符合索引列(id这里可能有些人有疑问,因为mysql的索引本质是B+树,在创建树的时候,会将主键id一起存储,想了解具体的知识点,可以去某站查看索引本质教学),可以使用索引进行查询,如上如所标识。
如果查询所有列,如下图所示:
会造成全表扫描,在大数量的表中,及其影响效率。
补充:此处的模糊查询通配符不管怎么写都是全表扫描。
6、字符串不加单引号索引失效(这个是最基本的,也是重要的一点)。
如下图所示,name是varchar类型,匹配1000,mysql会隐式的做类型转换,造成索引失效
如下图所示:name查询带’'的数据:
7、少用or,用它来连接时会索引失效。
8、注意联合索引的最左匹配原则(开头列、中间列不要跳过)。
补充:开头列、或者中间列跳过的话,会造成索引失效。
9、全值匹配我最爱。
10、存储引擎不能使用索引中 范围条件 右边的列
未完,待续中。。。。