首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL 中 SQL 语句为什么不走索引?

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

作者头像
杨焱
发布于 2021-12-07 20:00:17
发布于 2021-12-07 20:00:17
2.2K0
举报
文章被收录于专栏:杨焱的专栏杨焱的专栏

发表于2019-08-212020-03-03 作者 Ryan

首先, 明确一下在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)

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

代码语言:javascript
复制
# Turn tracing on (it's off by default):
SET optimizer_trace="enabled=on";
SELECT ...; # your query here
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
# possibly more queries...
# When done with tracing, disable it:
SET optimizer_trace="enabled=off";

总结一下:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档