单个索引
使用!=或者<>导致索引失效
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不走索引,后面的字段也将不走索引。