❤️ 博客首页:水滴技术
支持水滴:点赞 + 收藏⭐ + 留言
订阅专栏:MySQL 教程:从入门到精通
大家好,我是水滴~~
又到了跳槽季,今天我们来看一个被高频问到的面试题:MySQL 索引失效有哪些情况?我列举了下面几种,如果小伙伴们有补充的,欢迎给我留言哦。
下面例子的 like
是以通配符 %
开头的,使用 explain
检测,type
为 index
,表示会遍历整个索引树,索引失效。
可以使用以 % 结尾的语句,通过检测可以看出 type 为 range,表示只遍历给定范围的索引树,索引生效。
下面例子使用 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 列,所以会失效,如下图:
如下列,字段name
为索引列,而字段 height
为非索引列,中间使用 or
会导致索引失效。
《Python入门核心技术》
《IDEA 教程:从入门到精通》
《Java 教程:从入门到精通》
《MySQL 教程:从入门到精通》
《大数据核心技术从入门到精通》