MySQL 执行计划(EXPLAIN)背诵版

一、先背:执行计划怎么用

sql

复制代码
EXPLAIN SELECT * FROM 表 WHERE 条件;

只看 6 个字段:id、select_type、type、key、rows、Extra 这 6 个搞定,SQL 优化 90% 搞定。


二、核心字段逐字背诵版(必考必用)

1. id(执行顺序)

口诀:id 越大越先执行,id 相同从上往下执行。

  • id=1:主查询
  • id>1:子查询,数字越大优先级越高
  • id=NULL:最后执行(结果集计算)

2. select_type(查询类型)

只背 4 个:

  1. SIMPLE:简单查询(最优)
  2. SUBQUERY:子查询(性能差)
  3. DERIVED:衍生表 / 临时表(性能差)
  4. UNION:联合查询

判断:出现 SUBQUERY、DERIVED = 要优化


3. type(访问类型:SQL 快不快看它!)

背诵优先级(从好到坏)

plaintext

复制代码
system > const > eq_ref > ref > range > index > ALL

必须背下来的定义

  • const :根据主键 / 唯一索引查询,1 行结果(最优)
  • ref :普通索引查询,性能优秀
  • range :范围查询(between、in、>),合格
  • index :遍历索引树,一般
  • ALL全表扫描!必须优化!

底线标准

生产 SQL:type 必须 >= range,禁止 ALL!


4. key(实际使用的索引)

  • key = NULL没走索引,严重问题
  • key = 索引名:走了索引
  • key_len:索引长度,越大表示使用索引字段越多(越精准)

5. rows(扫描行数)

口诀:越少越好!

  • 越小 = SQL 越快
  • 大表 rows 上万 = 慢查询

6. Extra(额外信息:优化黄金区)

只背 5 个最关键:

  1. Using index 【最优】覆盖索引,不用回表,速度极快

  2. Using where 使用 where 过滤数据(正常)

  3. Using filesort 【严重】文件排序,必须优化! 原因:order by 字段无索引

  4. Using temporary 【严重】使用临时表,必须优化! 原因:group by 无索引

  5. Using where; Using index 【完美】覆盖索引 + 条件过滤


三、执行计划判断口诀(背诵版)

plaintext

复制代码
一看 type 是不是 ALL,是全表要修改
二看 key 是不是 NULL,没索引要创建
三看 Extra 两毒瘤:filesort、temporary 必须干掉
四看 rows 越少越好,超过千行要优化

四、3 秒判断 SQL 是否合格(背诵版)

一条好 SQL 执行计划必须满足:

  1. type >= range(不能是 ALL)
  2. key 不为 NULL(必须走索引)
  3. Extra 没有 Using filesort / Using temporary
  4. rows 尽量小

五、最常见 4 种坏情况 + 优化方案(背诵)

1. type = ALL(全表扫描)

优化:给 where 字段加索引

2. key = NULL(索引失效)

优化:

  • 索引列别用函数
  • 别隐式转换
  • 别违反最左前缀

3. Extra:Using filesort(文件排序)

优化:给 order by 字段建联合索引

4. Extra:Using temporary(临时表)

优化:给 group by 字段建索引


六、终极背诵版(一句话总结)

看 type 防全表,看 key 看索引,看 Extra 杀排序临时表,看 rows 看扫描量。


总结

你把上面内容背熟,就能:

  • 看懂任何 SQL 执行计划
  • 快速定位慢 SQL 原因
  • 面试直接满分
相关推荐
神龙天舞200118 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈19 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a20 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事20 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四21 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA21 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜21 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
每天都要进步哦1 天前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
不剪发的Tony老师1 天前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql
dotnet901 天前
批量生成所有表的修改脚本
数据库·sql·oracle