侧边栏壁纸
博主昵称
梦之中小俊

以前高中时,羡慕大学考试只要及格就行;现在大学了,怀念高中考试及不及格都行??

MySQL EXPLAIN 详解

梦之中小俊
2025-05-24 / 0 评论 / 23 阅读 / 推送成功!
一、EXPLAIN 是什么?
EXPLAIN 是 MySQL 提供的性能分析工具,用于查看 SQL 查询的执行计划(即优化器如何执行查询)。它通过模拟查询过程(不实际执行 SQL)返回一个表格,展示索引使用、表连接方式、扫描行数等关键信息,帮助开发者诊断性能瓶颈并优化查询。

核心作用:

分析查询是否高效利用索引。
识别全表扫描、临时表、文件排序等高开销操作。
提供优化方向,如调整索引或重构 SQL。
二、为什么要用 EXPLAIN?
性能调优:快速定位慢查询原因,例如未命中索引(type=ALL)或大量行扫描(rows值过高)。
索引验证:检查索引是否被实际使用(key列),避免冗余或低效索引。
查询重构:根据连接类型(type列)和额外信息(Extra列)优化复杂查询逻辑。
三、如何使用 EXPLAIN?
基本语法:

EXPLAIN [FORMAT=TRADITIONAL|JSON|TREE] SELECT ...;
1
FORMAT:指定输出格式,默认是表格形式(TRADITIONAL),JSON 格式包含更详细信息。
示例:

EXPLAIN SELECT * FROM users WHERE age > 30;
1
输出结果示例:

id	select_type	table	type	possible_keys	key	key_len	rows	Extra
1	SIMPLE	users	range	age	age	4	1000	Using where
四、执行计划指标详解
1. id
含义:查询中每个子查询或操作的唯一标识符。
规则:
相同 id:按从上到下顺序执行。
不同 id:数值越大优先级越高(如子查询优先执行)。
2. select_type
常见类型:
SIMPLE:简单查询(无子查询或 UNION)。
PRIMARY:最外层查询。
SUBQUERY:子查询中的 SELECT。
DERIVED:派生表(如 FROM 子句中的子查询)。
3. type
性能排序(从优到劣):
system > const > eq_ref > ref > range > index > ALL。
关键类型说明:
const:通过主键或唯一索引查询单条记录(如 WHERE id=1)。
eq_ref:多表关联时,主键或唯一索引的等值匹配(如 JOIN 中主键关联)。
ref:非唯一索引的等值匹配(可能返回多行)。
range:索引范围扫描(如 BETWEEN、IN)。
ALL:全表扫描,需优化索引或查询条件。
4. key 与 possible_keys
possible_keys:可能使用的索引(若为 NULL,表示无合适索引)。
key:实际使用的索引。若未命中索引(key=NULL),需检查 WHERE 条件或添加索引。
5. rows
含义:预估需要扫描的行数。若值过大,可能需优化索引或过滤条件。
6. Extra
关键信息:
Using index:覆盖索引(无需回表查询数据)。
Using filesort:额外排序(需优化 ORDER BY 或索引)。
Using temporary:使用临时表(常见于 GROUP BY 或复杂 JOIN)。
指标	含义	常见值/说明
id	查询的序列号(子查询执行顺序)	数值越大越先执行;相同 id 按从上到下顺序执行。
select_type	查询类型	SIMPLE(简单查询)、PRIMARY(外层查询)、SUBQUERY(子查询)等。
table	当前操作的表名	表名或别名,可能为 (派生表)或 (UNION 结果)。
type	访问类型(性能关键指标)	const(主键)、ref(索引)、range(范围索引)、ALL(全表扫描)等。
possible_keys	可能使用的索引	优化器评估可选的索引,若为 NULL 表示无可用索引。
key	实际使用的索引	若为 NULL 表示未使用索引。
key_len	索引使用的字节数	长度越短效率越高(例如复合索引是否完整使用)。
rows	预估需要扫描的行数	数值越大性能越差(需结合过滤条件判断)。
Extra	额外信息(重要优化线索)	Using index(覆盖索引)、Using where(过滤)、Using filesort(排序)等。
五、不使用 EXPLAIN 可能出现的问题
性能瓶颈难以定位

无法快速发现未命中索引的全表扫描(type=ALL),导致查询缓慢。
无法识别高开销操作(如 Using filesort 或 Using temporary),影响整体性能。
索引优化盲目性

可能创建冗余或低效索引(例如对低选择性字段建索引),浪费存储资源。
无法验证索引是否实际生效,导致“假优化”。
资源浪费与扩展性问题

未优化的查询可能大量占用 CPU、内存和磁盘 I/O,降低服务器吞吐量。
复杂查询(如多表 JOIN 或子查询)可能因执行计划不佳,导致系统在高并发下崩溃。
维护成本高

慢查询日志只能发现“已发生”的问题,而 EXPLAIN 能预防潜在性能风险。
缺乏执行计划分析时,代码重构或数据库升级容易引入性能退化。
六、总结
必用 EXPLAIN 的场景:

新上线 SQL 语句的性能验证。
慢查询日志中发现的低效 SQL 分析。
复杂 JOIN 或子查询的优化。
快速优化步骤:

检查 type 是否为 ALL(全表扫描) → 考虑添加索引。
检查 Extra 是否有 Using filesort 或 Using temporary → 优化排序或 GROUP BY。
检查 rows 是否远大于实际输出行数 → 优化 WHERE 条件或索引。
通过 EXPLAIN 分析,可将模糊的“慢查询”转化为具体的优化动作,大幅提升数据库性能!
————————————————
本文共 个字数,平均阅读时长 ≈ 分钟,您已阅读:0时0分0秒。
3

打赏

评论 (0)

OωO
  • ::(呵呵)
  • ::(哈哈)
  • ::(吐舌)
  • ::(太开心)
  • ::(笑眼)
  • ::(花心)
  • ::(小乖)
  • ::(乖)
  • ::(捂嘴笑)
  • ::(滑稽)
  • ::(你懂的)
  • ::(不高兴)
  • ::(怒)
  • ::(汗)
  • ::(黑线)
  • ::(泪)
  • ::(真棒)
  • ::(喷)
  • ::(惊哭)
  • ::(阴险)
  • ::(鄙视)
  • ::(酷)
  • ::(啊)
  • ::(狂汗)
  • ::(what)
  • ::(疑问)
  • ::(酸爽)
  • ::(呀咩爹)
  • ::(委屈)
  • ::(惊讶)
  • ::(睡觉)
  • ::(笑尿)
  • ::(挖鼻)
  • ::(吐)
  • ::(犀利)
  • ::(小红脸)
  • ::(懒得理)
  • ::(勉强)
  • ::(爱心)
  • ::(心碎)
  • ::(玫瑰)
  • ::(礼物)
  • ::(彩虹)
  • ::(太阳)
  • ::(星星月亮)
  • ::(钱币)
  • ::(茶杯)
  • ::(蛋糕)
  • ::(大拇指)
  • ::(胜利)
  • ::(haha)
  • ::(OK)
  • ::(沙发)
  • ::(手纸)
  • ::(香蕉)
  • ::(便便)
  • ::(药丸)
  • ::(红领巾)
  • ::(蜡烛)
  • ::(音乐)
  • ::(灯泡)
  • ::(开心)
  • ::(钱)
  • ::(咦)
  • ::(呼)
  • ::(冷)
  • ::(生气)
  • ::(弱)
  • ::(狗头)
泡泡
阿鲁
颜文字
取消
  1. 头像
    6767 Lv.1
    iPhone · Safari
    沙发

    画图

    回复
  2. 头像
    6767 Lv.1
    Windows 10 · Google Chrome
    板凳

    表情

    回复
  3. 头像
    透露 Lv.2
    Android · QQ Browser
    第30楼

    649494848

    回复