单个索引
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这种是不会命中索引的