当前位置: 首页 > news >正文

Explain 执行计划详解:SQL 性能瓶颈与索引命中分析

文章目录

    • 《Explain 执行计划详解:SQL 性能瓶颈与索引命中分析》
      • 一、前言:为什么要用 Explain
      • 二、Explain 基本语法
      • 三、type 字段:判断访问效率
        • 示例对比:
      • 四、key 与 possible_keys:索引使用情况
        • 示例:
      • 五、rows 与 filtered:扫描代价估算
      • 六、Extra 字段:隐藏的性能信号
      • 七、Explain 优化思路(五步法)
        • ① 看 type(访问方式)
        • ② 看 key(实际索引)
        • ③ 看 rows(扫描行数)
        • ④ 看 Extra(执行细节)
        • ⑤ 验证 SQL 改写效果
      • 八、实际案例:索引优化前后对比
        • 表结构:
        • 优化前:
        • 优化后:
      • 九、面试高频问题与答题模板
      • 十、总结


《Explain 执行计划详解:SQL 性能瓶颈与索引命中分析》


一、前言:为什么要用 Explain

大家好,我是程序员卷卷狗。

在 MySQL 中,SQL 的执行效率取决于优化器的决策。
优化器会根据表结构、索引、统计信息,选择一条“最优路径”去执行查询。

我们可以用 EXPLAIN 查看优化器选择的执行方案,
从而判断:

  • SQL 是否使用索引;
  • 是否走全表扫描;
  • 哪个表先被连接;
  • 过滤行数预估是多少。

一句话:

EXPLAIN 是读懂 SQL 性能瓶颈的第一步。


二、Explain 基本语法

EXPLAIN SELECT * FROM user WHERE age > 18;

或更详细版本:

EXPLAIN FORMAT=JSON SELECT * FROM user WHERE age > 18;

常见输出字段

字段名含义
id查询执行顺序(越大越先执行)
select_type查询类型(简单查询/子查询/联合查询)
table当前访问的表
partitions使用的分区(若有)
type连接类型(访问方式)
possible_keys可能用到的索引
key实际使用的索引
key_len索引长度
ref索引匹配的列
rows预估扫描行数
filtered过滤比例
Extra额外信息(最关键)

三、type 字段:判断访问效率

type 表示 MySQL 如何访问数据,是最重要的指标。

值(从优到劣)含义示例
system只有一行数据特殊情况
const主键或唯一索引等值查询WHERE id=1
eq_ref联表时主键匹配JOIN 场景
ref非唯一索引等值匹配WHERE name='卷卷狗'
range范围扫描WHERE age>20
index全索引扫描只访问索引,不访问表
ALL全表扫描最低效

记忆口诀:

system → const → eq_ref → ref → range → index → ALL
→ 越靠前越好。

示例对比:
EXPLAIN SELECT * FROM user WHERE id=1;
-- type: const ✅
EXPLAIN SELECT * FROM user WHERE age>20;
-- type: range ⚠️
EXPLAIN SELECT * FROM user;
-- type: ALL ❌

四、key 与 possible_keys:索引使用情况

字段说明
possible_keys优化器认为“可能可用”的索引
key实际被使用的索引
示例:
EXPLAIN SELECT * FROM user WHERE name='卷卷狗';

输出:

possible_keys: idx_name
key: idx_name

→ 索引命中成功。

key 为空:

possible_keys: idx_name
key: NULL

→ 索引未被使用,需检查:

  • 是否类型不匹配;
  • 是否函数作用在列上;
  • 是否联合索引失效。

五、rows 与 filtered:扫描代价估算

字段含义
rows预估扫描行数(越少越好)
filtered过滤比例(0~100%)

例如:

rows: 10000
filtered: 10

表示优化器预估会扫描 1 万行,其中 10% 能通过过滤。

关键启示:
如果 rows 太大,说明索引选择性差,需要优化。


六、Extra 字段:隐藏的性能信号

Extra 提供额外优化信息,
是判断是否“真正走索引”的关键。

Extra含义说明
Using index覆盖索引(不回表) ✅
Using index condition索引下推(ICP 优化) ✅
Using where使用 where 过滤(可能未走索引) ⚠️
Using temporary使用临时表(排序/分组代价大) ❌
Using filesort文件排序(未命中索引排序) ❌
Using join bufferJOIN 时使用缓存(无索引) ⚠️
Impossible whereWHERE 条件恒 false
Using MRR多范围读取(优化 IO) ✅

出现 “Using index” 是性能最好的信号。
“Using filesort” 通常是性能瓶颈的标志。


七、Explain 优化思路(五步法)

① 看 type(访问方式)
  • 是否为 constrefrange
  • 若为 ALL,说明未走索引。
② 看 key(实际索引)
  • 检查是否命中正确索引;
  • 若空,考虑索引设计或条件改写。
③ 看 rows(扫描行数)
  • 行数大说明过滤不精准;
  • 可通过添加索引或优化条件减少扫描量。
④ 看 Extra(执行细节)
  • 避免 Using filesortUsing temporary
  • 确保出现 Using indexUsing index condition
⑤ 验证 SQL 改写效果
  • 使用 ANALYZE TABLE 更新统计信息;
  • 再次 EXPLAIN 观察优化效果。

八、实际案例:索引优化前后对比

表结构:
CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_name_age (name, age)
);
优化前:
EXPLAIN SELECT * FROM user WHERE age>20;

输出:

type: ALL
rows: 100000
Extra: Using where

→ 未走索引,全表扫描。

优化后:
EXPLAIN SELECT * FROM user WHERE name='卷卷狗' AND age>20;

输出:

type: range
key: idx_name_age
rows: 120
Extra: Using index condition

→ 命中联合索引,性能大幅提升。


九、面试高频问题与答题模板

问题答案要点
Q1:EXPLAIN 的作用是什么?查看 SQL 执行计划,分析是否走索引。
Q2:type 字段代表什么?表示访问方式,从 const 到 ALL 性能递减。
Q3:possible_keys 与 key 的区别?前者是可用索引,后者是实际使用索引。
Q4:rows 越大说明什么?扫描行数多,索引不精准。
Q5:Extra 中哪些是性能警告?Using filesort、Using temporary。
Q6:如何判断走了覆盖索引?Extra 出现 Using index。
Q7:如何改写 SQL 提升 type 等级?优化索引结构、避免函数、改写 WHERE 顺序。

十、总结

EXPLAIN 是 SQL 优化的“放大镜”,
它能揭示每条语句的执行细节与瓶颈所在。

一句话记住:

看 type 判路径,看 key 判命中,看 Extra 判代价。

掌握这三个核心指标,就能判断 SQL 是否真正高效。

下一篇(第 16 篇),我将写——
《MySQL 慢查询优化:从定位、分析到索引调优的完整流程》
手把手讲清楚如何使用 slow_query_log、EXPLAIN、优化重写 SQL。

http://www.dtcms.com/a/601827.html

相关文章:

  • 汕头网址模板建站广西明电建设有限公司网站
  • 新增目录在vscode git中不可见但git status可见的问题
  • 网站备案信息更改审核要多久智能产品创新设计
  • 大模型加速的其他方法简记
  • Linux C语言编译器的使用与调试技巧
  • [c++]宏函数与内联函数
  • 广州网站定做西安网站开发服务费用
  • 桂林网站建设招聘制作公司网站怎么做
  • 电脑CPU温度多少算正常?温度过高的原因分析
  • 广安住房和城乡建设厅网站10分钟免费建网站
  • 系统监控“可视化“实战:3步搭建企业级监控面板
  • 株洲网站建设优度外贸培训
  • 使用DelayQueue 分布式延时队列,干掉定时任务!
  • 外贸网站开发多少钱汕头百度seo电话
  • C语言反编译技术分析 | 探讨其实现原理与应用场景
  • C语言经过编译后 | 了解编译过程对程序执行的影响
  • 哈尔滨h5模板建站比较开放的浏览器
  • 公司网站模板设计网站建设挣钱么
  • 想自己做点飘纱素材到网站上买自己电脑做服务器搭建网站有域名
  • 电子电气架构 ---系统工程与系统架构的内涵
  • 2024年蚌埠市科学技术奖提名工作申报条件程序通知
  • 基于MATLAB的复杂场景下车牌识别与车辆信息管理系统
  • Free Pycharm in Docker
  • TiDB 备份与恢复整理
  • 网站运营 开发上上海海网网站站建设
  • 公司怎样制作网站织梦做双语网站
  • Spring 中的 @ExceptionHandler 注解详解与应用
  • 网站建设有哪些软件卖鞋做哪个网站好
  • linux课堂练习1112
  • OpenStack 在线扩容卷超时问题