不走索引场景

  1. 索引列参与计算
        SELECT `sname` FROM `t_stu` WHERE `age`=20;       -- 会使用索引
    SELECT `sname` FROM `t_stu` WHERE `age`+10=30;    -- 不会使用索引!!因为所有索引列参与了计算
    SELECT `sname` FROM `t_stu` WHERE `age`=30-10;    -- 会使用索引
    
  2. 索引列使用函数
    SELECT `sname` FROM `stu` WHERE concat(`sname`,'abc') ='Jaskeyabc';   -- 不会使用索引,因为使用了函数运算,原理与上面相同
    

SELECT sname FROM stu WHERE sname=concat('Jaskey','abc'); -- 会使用索引 ```

  1. 索引列使用了Like %XXX

  2. 使用 OR 连接的条件可能导致索引失效。如果 OR 的两边没有索引,或者只有一边有索引,通常不会走索引

  3. 类型隐式转换,会导致全表扫描

  4. 不等于比较(比如时间字段) 当查询条件为字符串时,使用”<>“或”!=“作为条件查询,有可能不走索引,但也不全是,当查询结果集占比比较小时,会走索引,占比比较大时不会走索引。此处与结果集与总体的占比有关。

  5. is not null 查询条件使用is null时正常走索引,使用is not null时,不走索引。

  6. order by导致索引失效 当查询条件涉及到order by、limit等条件时,是否走索引情况比较复杂,而且与Mysql版本有关,通常普通索引,如果未使用limit,则不会走索引。order by多个索引字段时,可能不会走索引。其他情况,建议在使用时进行expain验证。 ORDER BY的索引优化。如果一个SQL语句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。

  7. not in和not exists (非主键时,索引失效)