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

MySQL 面试题(一):索引失效的几种情况_第1张图片

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

文章目录

  • 一、like 以通配符 % 开头的索引会失效
  • 二、is not null 无法使用索引,is null 可以使用索引
  • 三、表达式或函数中的索引列会失效
  • 四、联合索引未遵循最左前缀原则会失效
  • 五、or 前后出现非索引列,索引会失效
  • 热门专栏


大家好,我是水滴~~

又到了跳槽季,今天我们来看一个被高频问到的面试题: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,不是顺序的)

下面的例子也验证了上面说的那四种组合是生效的。
MySQL 面试题(一):索引失效的几种情况_第2张图片
有一点不要搞错了,最左前缀原则与 where 子句的字段顺序无关,如下面的例子,它们是生效的。
MySQL 面试题(一):索引失效的几种情况_第3张图片
再来看一些索引失效的例子,它们都没有使用 a 列,所以会失效,如下图:
MySQL 面试题(一):索引失效的几种情况_第4张图片

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

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


热门专栏

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

MySQL 面试题(一):索引失效的几种情况_第5张图片

你可能感兴趣的:(MySQL,教程:从入门到精通,经典面试题合集,mysql,数据库,面试)