mysql · 2021-11-30 0

mysql8 索引失效

单个索引

1、筛选数据量超过一定比例,索引失效

查询数量大于等于 35%,会使得索引失效,进行全表扫描

2、使用!= 或者 <> 导致索引失效

如果!= 或者 <> 这种都会导致索引失效,进行全表扫描

3、类型不一致导致的索引失效

两个表关联,字段类型不一致,会导致索引失效

4、函数导致的索引失效

5、运算符导致的索引失效

如果你对列进行了(+,-,*,/,!), 那么都将不会走索引

WHERE id - 1 = 3

6、OR可能引起的索引失效

如果OR连接的是同一个字段,查询数量大于等于 35%,那么索引会失效,反之索引不失效。

如果OR连接的是两个索引字段,两个条件过滤的数据量(这里的数据量非结果数据量,是各自过滤的数据量和)大于等于25%,则索引失效。

如果OR连接的是一个索引字段,一个非索引字段,会导致索引失效。

7、模糊搜索导致的索引失效

8、NOT IN、NOT EXISTS导致索引失效

9、IS NULL,IS NOT NULL 可能不走索引

如果 NULL 值很多,IS NULL 不走索引,IS NOT NULL 走索引;如果 NOT NULL 值很多,IS NULL 走索引,IS NOT NULL 不走索引 (mysql 8,测试一万数据有值,几条数据无值下,是这样的)

设计字段的时候,如果没有必要的要求必须为NULL,那么最好给个默认值空字符串,使用 "=",走索引

联合索引

1、最左匹配原则

如果想要使用一个或者两个字段在where条件上,必须有组合索引里的第一个字段,但是与顺序无关,例如a,c或c,a,这种场景是可以命中索引的。但是,b,c或c,b这种是不会命中索引的