MySQL 中 SQL 语句为什么不走索引?

首先, 明确一下在MySQL 中,执行 SQL 语句流程如下(图来自网络):

一条 SQL 语句的执行,主要经过两个重要的组件:1. SQL 命令解析器;2. 代价分析器;代价分析器没有在这个图中展示出来;这也是 SQL 未命中索引的关键所在。

下面来讲一下,如何定位 SQL 未走索引的原因

我们大部分情况下,使用的是 Explain 来分析 SQL 语句是否走索引,即便语法分析的时候是走了索引的,执行的时候,还是有可能没有走索引。原因到底是什么?

如果你详细看过 MySQL 官方网站的说明文档,会看到这一章节内容:Chapter 8 Tracing the Optimizer (https://dev.mysql.com/doc/internals/en/optimizer-tracing.html

官方给出的使用语法,很简单吧:

总结一下:

原因简单来说就是:MySQL在执行 SQL 的的时候,对 SQL 的执行代价会有个判断,如果走索引的代价,超过不走索引,那它就放弃使用索引,也就是我们执行 SQL 时,所遇到的 explain 分析走索引,真正线上执行没有走索引的原因。

另外,网络上有大量的博文都说:<> 、!、!= 等非判断,是不走索引的,其实是不严谨的,或者说是错误的,真正的原因与这里说的 “执行代价分析”都是一回事。

Leave a Comment

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据