单个索引

  • 使用!=或者<>导致索引失效
    SELECT * FROM user WHERE name != '冰峰';
    给name字段建立了索引,但是如果!= 或者 <> 这种都会导致索引失效。
    通过分析SQL看到,type类型是ALL,进行全表扫描,所以如果数据量大的话,谨慎使用

  • 类型不一致导致索引失效
    SELECT * FROM user WHERE height = 175;
    height表字段类型是varchar,但是我查询的时候使用了数字类型,因为这个中间存在一个隐式的类型转换,所以就会导致索引失效,进行全表扫描。

  • 函数导致的索引失效
    SELECT * FROM user WHERE DATE(create_time) = '2020-09-03';

  • 运算符导致的索引失效
    SELECT  FROM user WHERE age - 1 = 20;
    对列进行了(+,-,
    ,/,!), 那么都将不会走索引。

  • OR引起的索引失效
    SELECT * FROM user WHERE name = '张三' OR height = '175';
    OR导致索引是在特定情况下的,并不是所有的OR都是使索引失效,如果OR连接的是同一个字段,那么索引不会失效,反之索引失效。

  • 模糊搜索导致的索引失效
    SELECT * FROM user WHERE name LIKE '%冰';
    模糊搜索如果你前缀也进行模糊搜索,那么不会走索引。

  • NOT IN、NOT EXISTS导致索引失效 SELECT s. FROM user s WHERE NOT EXISTS (SELECT  FROM user u WHERE u.name = s.name AND u.name = '冰峰’);
    SELECT * FROM user WHERE name NOT IN ('冰峰');
    这两种用法,也将使索引失效。但是NOT IN 还是走索引的,千万不要误解为 IN 全部是不走索引的。

复合索引

  • 最左匹配原则
    SELECT * FROM user WHERE sex = '男' AND age = 22 AND name = '冰峰';
    最左匹配原则:就是对于符合索引来说,它的一个索引的顺序是从左往右依次进行比较的。
    mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。

  • 如果使用了!=会导致后面的索引全部失效
    SELECT * FROM user WHERE sex = '男' AND name  != '冰峰' AND age = 22;
    在name字段使用了 != ,由于name字段是最左边的一个字段,根据最左匹配原则,如果name不走索引,后面的字段也将不走索引。