我们首先要知道一个sql语句到底走不走索引,取决于内部优化器的选择,他选择走索引那就走索引,他选择不走索引那就不走索引。索引失效也就意味着,优化器觉得不走索引还要好点。我们就要尽量避免这样的sql出现。那么有哪些常见的情况下会导致索引失效呢?
1.不遵守联合索引的最左前缀匹配原则。 我们知道联合索引他是首先根据最左边的字段进行排序生成索引的。如果我们直接跳过左边字段,那么就会导致全表查找。这样还不如不走索引,直接走聚簇,进行全表。还省了回表操作。所以索引就失效了。
2.左模糊匹配字符串 (如:“%张” 或者 “_张”)。%是模糊匹配任意个字符,_是模糊匹配一个字符。这个失效的原理就和第一条类似,mysql在对字符串建立索引时,是将一个字符串中的每一个字符转化为ASCll码来进行大小比对。并且顺序是最左边的字符开始,如果相等那么再进行第二个字符的比对。所以当进行左模糊匹配字符串时,也不会走索引,原理和第一条类似。
3. **计算,函数会导致索引失效。**下图第一个查询语句会用到索引,第二个会导致索引失效,为什么呢。那是因为在进行对emp.name进行前,还要先取出前三个,再进行判断。所以会导致全表查询然后再进行判断。因此会失效
4.不等于(!= 或者 <>)失效。当条件是=时,会走索引。那为什么不等于不会走索引呢。想必也很好想到。不等于的话就要进行全表查询,看哪些是不等于。所以会失效。
5.IS NOT NULL 会失效。当条件是IS NUll时会走,相反IS NOT NULL 不会走索引。 这个原理和上一条一样。 IS NULL 就相当于 = ,IS NOT NULL 就相当于!=。
说到以上我觉得差不多就够了,多的也没必要记。也记不全。
