“索引什么时候生效?”
面试过程中,从天而降的一个问题,是不是有点懵?
没关系,关注我,面试不迷路。
我是 Mic,一个工作了 14 年的 Java 程序员。
索引生效波及到的知识点十分多,所以我把这个问题的答复整顿到了一个 20W 字的面试文档外面,大家能够支付。
上面看看高手的答复
高手:
InnoDB 引擎外面有两种索引类型,一种是主键索引、一种是一般索引。
InnoDB 用了 B + 树的构造来存储索引数据。
当应用索引列进行数据查问的时候,最终会到主键索引树中查问对应的数据行进行返回。
实践上来说,应用索引列查问,就能很好的晋升查问效率,然而不标准的应用会导致索引生效,从而无奈施展索引自身的价值。
导致索引生效的状况有很多:
-
在索引列上做运算,比方应用函数,Mysql 在生成执行打算的时候,它是依据统计信息来判断是否要应用索引的。
而在索引列上加函数运算,导致 Mysql 无奈辨认索引列,也就不会再走索引了。
不过从 Mysql8 开始,减少了函数索引能够解决这个问题。
-
在一个由多列形成的组合索引中,须要依照最左匹配法令,也就是从索引的最左列开始程序检索,否则不会走索引。
在组合索引中,索引的存储构造是依照索引列的程序来存储的,因而在 sql 中也须要依照这个程序能力进行逐个匹配。
否则 InnoDB 无奈辨认索引导致索引生效。
-
当索引列存在隐式转化的时候,比方索引列是字符串类型,然而在 sql 查问中没有应用引号。
那么 Mysql 会主动进行类型转化,从而导致索引生效。
- 在索引列应用不等于号、
not
查问的时候,因为索引数据的检索效率非常低,因而 Mysql 引擎会判断不走索引。 -
应用 like 通配符匹配后缀
%xxx
的时候,因为这种形式不合乎索引的最左匹配准则,所以也不会走索引。然而反过来,如果通配符匹配的是前缀
xxx%
,合乎最左匹配,也会走索引。 - 应用
or
连贯查问的时候,or
语句前后没有同时应用索引,那么索引会生效。只有or
左右查问字段都是索引列的时候,才会失效。
除了这些场景以外,对于多表连贯查问的场景中,连贯程序也会影响索引的应用。
不过最终是否走索引,咱们能够应用 explain 命令来查看 sql 的执行打算,而后针对性的进行调优即可。
总结
Mysql 外面很多问题都能够考查毕竟它也是工作中应用十分频繁的组件,按情理来说,咱们是有必要去深度学习 Mysql 的底层原理。
毕竟数据的安全性、数据 IO 性能都会影响到零碎的整体吞吐量。
大家记得点赞、珍藏加关注。
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!