MySQL 面试题(一):索引失效的几种情况

在这里插入图片描述

❤️ 博客首页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:MySQL 教程:从入门到精通


大家好,我是水滴~~

又到了跳槽季,今天我们来看一个被高频问到的面试题:MySQL 索引失效有哪些情况?我列举了下面几种,如果小伙伴们有补充的,欢迎给我留言哦。

一、like 以通配符 % 开头的索引会失效

下面例子的 like 是以通配符 % 开头的,使用 explain 检测,typeindex,表示会遍历整个索引树,索引失效
在这里插入图片描述

可以使用以 % 结尾的语句,通过检测可以看出 type 为 range,表示只遍历给定范围的索引树,索引生效。
在这里插入图片描述

二、is not null 无法使用索引,is null 可以使用索引

下面例子使用 is not null 语句,通过检查可以看出 typeindex,表示会遍历整个索引树,索引失效
在这里插入图片描述
如果换成 is null,检测结果为 ref,索引生效。
在这里插入图片描述

三、表达式或函数中的索引列会失效

下面例子的 age 索引列为表达式的一部分,通过检测可以看出 typeall,表示为全表扫描,索引失效
在这里插入图片描述
下面例子的 name 索引列为函数的一部分,通过检测可以看出 type 为 all,表示为全表扫描,索引失效。
在这里插入图片描述

四、联合索引未遵循最左前缀原则会失效

联合索引是指对一张表上的多个字段进行索引,例如:i_abc 索引是由 (a, b, c) 三列联合创建起来的索引。
最左前缀原则是指最左匹配,以最左边字段为起点,任何连续的字段都能匹配上索引。在 (a, b, c) 联合索引中,想要索引生效,只能使用 aababcac四种组合,其它组合都会失效。所以在联合索引中,字段的顺序很重要。(注:ac 实际上只使用了 a 列的索引,因为它略过了b,不是顺序的)

下面的例子也验证了上面说的那四种组合是生效的。
在这里插入图片描述
有一点不要搞错了,最左前缀原则与 where 子句的字段顺序无关,如下面的例子,它们是生效的。
在这里插入图片描述
再来看一些索引失效的例子,它们都没有使用 a 列,所以会失效,如下图:
在这里插入图片描述

五、or 前后出现非索引列,索引会失效

如下列,字段name为索引列,而字段 height 为非索引列,中间使用 or 会导致索引失效
在这里插入图片描述


热门专栏

👍 《Python入门核心技术
👍 《IDEA 教程:从入门到精通
👍 《Java 教程:从入门到精通
👍 《MySQL 教程:从入门到精通
👍 《大数据核心技术从入门到精通

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值