文字:756 阅读:2分钟
索引失效的情况挺多,但大多同学都是靠死记硬背回答上那么两三个,想了一个顺口溜分享给大家
最左函数 模糊运算 得 空值类型
大家可以多念几次,意思就是一个叫“最左“的函数进行模糊运算,返回结果得到“空值类型”。分项解释一下
最左
就是索引的最左前缀原则,如果联合索引不使用最左侧的列查询,将会造成索引失效。
函数
代表where条件后有函数计算的,如日期计算,因为索引列计算后可能与建立时的列发生变化 ,无法定位到索引,如果查询条件不是针对索引列的,那依然走索引
模糊
代表模糊查询,like '%你好',这种大概率会走全面扫描
运算
索引列上使用+ = * / 索引可能会失效
空值
is NULL is not Null 或是or一起使用,可能会造成索引失效
类型
查询条件为数值类型的,而我们在条件中使用了引号字符串,数据库会默认隐式转换,这种可能会导致索引失效。
本质原因
其实这个口诀只是为了方便记忆,但失效的原因,可能并不是一个口诀全都能代表的,我们要发现其背后的本质原因。
你是否发现他们都会有一个共同点:
查询结果在索引中不连续。一旦记录不连续,就无法发挥二分查找的作用,在去返回这些分散结果时,I/O的次数就会增多。
从上面这张图中,如果查询结果相差很远,分别是2和7的位置,那就要从一个子节点向另外一个子节点查找,这样索引就会失效。
而我们刚才说的可能失效,如果MySQL发现查找的结果仍然在一个数据页内,还是会走索引,这个主要看优化器的分析。
所以,索引失效与否的本质,是查询结果有没有利用上索引的连续性。明白这个问题,其实大家也不用死记硬背了。
好了,今天的内容就这么多。
PS:
领导对一个人的评价是动态的,可能你昨天的某一句话因为场合原因说错了,受到批评,而今天又因为PLAN B的方案,让公司避免损失而受到表扬,其实这都是你,一个动态和成长中的你,领导想看到的是稳定成长,越来越靠谱的你。
关注我,带你一起进化!
更多面试资料