MySQL 索引失效
一、以下情况会导致 MySQL 索引失效:二、那么为什么上面这些情况会导致索引失效呢?我们要知其然知其所以然。01. 先分析一个遵循最佳最左原则的例子,分析如下:02. 再来看看不遵循最佳左前缀的例子,分析如下:03. 范围查询右边失效原理三、总结:一、以下情况会导致 MySQL 索引失效:
如果左边的值未确定,那么无法使用此索引。比如:select * from table where a>1 and b=2; (a不确定,所以a和b 的联合索引就用不到。)。计算、函数、类型转换 ( 自动或手动 ) 导致索引失效。is null 可以使用索引,is not null 无法使用索引。or 前后只要存在非索引的列,都会导致索引失效。like 查询是以 % 开头(eg:like %王)。
二、那么为什么上面这些情况会导致索引失效呢?我们要知其然知其所以然。
01. 先分析一个遵循最佳最左原则的例子,分析如下:
select * from testTable where a=1 and b=2
首先 a 字段在B+树上是有序的,所以我们可以通过二分查找法来定位到a=1的位置。
其次在 a 确定的情况下,b 是相对有序的,因为有序,所以同样可以通过二分查找法找到 b=2 的位置。
其次在 a 确定的情况下,b 是相对有序的,因为有序,所以同样可以通过二分查找法找到 b=2 的位置。
02. 再来看看不遵循最佳左前缀的例子,分析如下:
select * from testTable where b=2
我们来回想一下 b 有顺序的前提是:在 a 确定的情况下。
现在你的 a 都飞了,那 b 肯定是不能确定顺序的,在一个无序的 B+树上是无法用二分查找来定位到 b 字段的。
所以这个时候,是用不上索引的。
03. 范围查询右边失效原理
字符串的排序方式:先按照第一个字母排序,如果第一个字母相同,就按照第二个字母排序。。。以此类推。
三、总结:
简单来说,索引查找就是二分查找,凡是不能二分查找的情况都属于索引失效的情况。