当前位置: 首页 > 后端技术 > Java

【Java面试】这道高频网络面试题难倒80%程序员?索引什么时候失效?

时间:2023-04-02 01:25:16 Java

“指数什么时候到期?”面试的时候突然冒出来一个问题,是不是有点绕?没关系,跟着我,别在采访中迷路了。我是Mic,一名拥有14年经验的Java程序员。索引失效涉及的知识点比较多,所以我把这个问题的答案整理成一个20W字的面试文档,大家可以领取。我们来看看专家的回答。专家:InnoDB引擎中有两种索引,一种是主键索引,一种是普通索引。InnoDB使用B+树结构来存储索引数据。当使用索引列进行数据查询时,会在主键索引树中查询对应的数据行并返回。从理论上讲,使用索引列进行查询可以提高查询效率,但不规范的使用会导致索引失效,从而无法充分利用索引本身的价值。导致索引失败的情况有很多种:在对索引列进行操作时,比如使用函数,Mysql在生成执行计划时,根据统计信息判断是否使用索引。但是在索引列中加入函数操作,使得Mysql无法识别索引列,也就不会再使用索引了。不过从Mysql8开始,函数索引的加入可以解决这个问题。在由多列组成的复合索引中,需要遵循最左匹配规则,即从索引的最左列开始依次查找,否则索引将无法使用。在复合索引中,索引的存储结构是按照索引列的顺序存储的,所以在SQL中,也需要按照这个顺序逐一匹配。否则InnoDB无法识别索引,导致索引失效。当索引列有隐式转换时,比如索引列是string类型,但是在SQL查询中没有使用引号。那么Mysql会自动进行类型转换,会导致索引失败。当索引列使用不等号或不查询时,Mysql引擎会判断不使用索引,因为索引数据的检索效率很低。在使用like通配符匹配后缀%xxx时,由于这种方式不符合索引的最左匹配原则,所以不会去索引。但反过来,如果通配符匹配到前缀xxx%,也就是匹配到最左边的匹配,那么索引也会被取走。在使用or连接查询时,如果or语句前后没有同时使用索引,索引就会失效。只有当或的左右查询字段为索引列时,才会生效。除了这些场景,在多表连接查询的场景下,连接顺序也会影响索引的使用。不过到底要不要使用索引,我们可以通过explain命令查看SQL的执行计划,然后进行针对性的调优。综上所述,Mysql的很多问题都是可以排查的。毕竟也是工作中使用频率非常高的组件。按理来说,我们有必要深入研究一下Mysql的底层原理。毕竟数据安全和数据IO性能会影响系统的整体吞吐量。大家记得点赞、收藏和关注。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!