❤️ 博客首页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:MySQL 教程:从入门到精通
文章目录
- 一、like 以通配符 % 开头的索引会失效
- 二、is not null 无法使用索引,is null 可以使用索引
- 三、表达式或函数中的索引列会失效
- 四、联合索引未遵循最左前缀原则会失效
- 五、or 前后出现非索引列,索引会失效
- 热门专栏
大家好,我是水滴~~
又到了跳槽季,今天我们来看一个被高频问到的面试题:MySQL 索引失效有哪些情况?我列举了下面几种,如果小伙伴们有补充的,欢迎给我留言哦。
一、like 以通配符 % 开头的索引会失效
下面例子的 like
是以通配符 %
开头的,使用 explain
检测,type
为 index
,表示会遍历整个索引树,索引失效。
可以使用以 % 结尾的语句,通过检测可以看出 type 为 range,表示只遍历给定范围的索引树,索引生效。
二、is not null 无法使用索引,is null 可以使用索引
下面例子使用 is not null
语句,通过检查可以看出 type
为 index
,表示会遍历整个索引树,索引失效。
如果换成 is null,检测结果为 ref,索引生效。
三、表达式或函数中的索引列会失效
下面例子的 age
索引列为表达式的一部分,通过检测可以看出 type
为 all
,表示为全表扫描,索引失效。
下面例子的 name 索引列为函数的一部分,通过检测可以看出 type 为 all,表示为全表扫描,索引失效。
四、联合索引未遵循最左前缀原则会失效
联合索引是指对一张表上的多个字段进行索引,例如:
i_abc
索引是由(a, b, c)
三列联合创建起来的索引。
最左前缀原则是指最左匹配,以最左边字段为起点,任何连续的字段都能匹配上索引。在(a, b, c)
联合索引中,想要索引生效,只能使用a
、ab
、abc
和ac
四种组合,其它组合都会失效。所以在联合索引中,字段的顺序很重要。(注:ac
实际上只使用了a
列的索引,因为它略过了b
,不是顺序的)
下面的例子也验证了上面说的那四种组合是生效的。
有一点不要搞错了,最左前缀原则与 where 子句的字段顺序无关,如下面的例子,它们是生效的。
再来看一些索引失效的例子,它们都没有使用 a 列,所以会失效,如下图:
五、or 前后出现非索引列,索引会失效
如下列,字段name
为索引列,而字段 height
为非索引列,中间使用 or
会导致索引失效。
热门专栏
👍 《Python入门核心技术》
👍 《IDEA 教程:从入门到精通》
👍 《Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》
👍 《大数据核心技术从入门到精通》