必答内容:
好的,索引失效这个问题,确实是在项目开发中非常常见的一类问题。那我就结合我之前的项目经验来聊一下,之前遇到的一些索引失效的场景:
第一类呢,就是在联合索引使用的时候,违反最左前缀法则,比如查询的条件并不是从索引最左边的列开始的。
第二类呢,就是范围查询(非等值查询)右侧的列,不能使用索引。
第三类呢,就是在索引列上进行运算或函数操作,索引将失效。非常典型的,像我们基于substring这样的函数截取字段值。
以及如果在条件匹配时,需要进行隐式类型转换的时候。比如:where gender=1,而gender是char类型
这种字符串不加引号,虽然查也能查出来,但也会造成索引失效。还有像常见的,以 % 开头的like模糊匹配,索引也会失效。当然这样的场景很多啊,上面这几个只是比较常见的索引失效的场景,所以在项目开发中,编写SQL时,就要避免这些情况的发生。
进阶内容:
而对于索引是否生效,到底走哪个索引,以及具体SQL语句的执行性能到底怎么样。这个我们可以借助于explain 来查看sql语句的执行计划,具体问题具体分析。我们可以通过explain执行计划中的 key 来确定此次查询是否使用了索引,以及通过 type 来判定SQL的执行性能,一定要规避 type 为all全表扫描的情况,还有像 extra 的信息也需要关注一下。