乐趣区

关于java:Java面试这道互联网高频面试题难住了80的程序员索引什么时候失效

“索引什么时候生效?”

面试过程中,从天而降的一个问题,是不是有点懵?

没关系,关注我,面试不迷路。

我是 Mic,一个工作了 14 年的 Java 程序员。

索引生效波及到的知识点十分多,所以我把这个问题的答复整顿到了一个 20W 字的面试文档外面,大家能够支付。

上面看看高手的答复

高手:

InnoDB 引擎外面有两种索引类型,一种是主键索引、一种是一般索引。

InnoDB 用了 B + 树的构造来存储索引数据。

当应用索引列进行数据查问的时候,最终会到主键索引树中查问对应的数据行进行返回。

实践上来说,应用索引列查问,就能很好的晋升查问效率,然而不标准的应用会导致索引生效,从而无奈施展索引自身的价值。

导致索引生效的状况有很多:

  1. 在索引列上做运算,比方应用函数,Mysql 在生成执行打算的时候,它是依据统计信息来判断是否要应用索引的。

    而在索引列上加函数运算,导致 Mysql 无奈辨认索引列,也就不会再走索引了。

    不过从 Mysql8 开始,减少了函数索引能够解决这个问题。

  2. 在一个由多列形成的组合索引中,须要依照最左匹配法令,也就是从索引的最左列开始程序检索,否则不会走索引。

    在组合索引中,索引的存储构造是依照索引列的程序来存储的,因而在 sql 中也须要依照这个程序能力进行逐个匹配。

    否则 InnoDB 无奈辨认索引导致索引生效。

  3. 当索引列存在隐式转化的时候,比方索引列是字符串类型,然而在 sql 查问中没有应用引号。

    那么 Mysql 会主动进行类型转化,从而导致索引生效。

  4. 在索引列应用不等于号、not查问的时候,因为索引数据的检索效率非常低,因而 Mysql 引擎会判断不走索引。
  5. 应用 like 通配符匹配后缀 %xxx 的时候,因为这种形式不合乎索引的最左匹配准则,所以也不会走索引。

    然而反过来,如果通配符匹配的是前缀xxx%,合乎最左匹配,也会走索引。

  6. 应用 or 连贯查问的时候,or语句前后没有同时应用索引,那么索引会生效。只有 or 左右查问字段都是索引列的时候,才会失效。

除了这些场景以外,对于多表连贯查问的场景中,连贯程序也会影响索引的应用。

不过最终是否走索引,咱们能够应用 explain 命令来查看 sql 的执行打算,而后针对性的进行调优即可。

总结

Mysql 外面很多问题都能够考查毕竟它也是工作中应用十分频繁的组件,按情理来说,咱们是有必要去深度学习 Mysql 的底层原理。

毕竟数据的安全性、数据 IO 性能都会影响到零碎的整体吞吐量。

大家记得点赞、珍藏加关注。

版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 Mic 带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!

退出移动版