0

0

SQL EXPLAIN 输出字段逐项解析

冷炫風刃

冷炫風刃

发布时间:2026-01-21 20:49:02

|

675人浏览过

|

来源于php中文网

原创

EXPLAIN 是 MySQL 查看查询执行计划的核心命令,用于优化慢查询;其输出字段包括 id(SELECT 序号)、select_type(查询类型)、table(访问表名)、type(连接类型,性能由优到劣为 system→const→eq_ref→ref→range→index→ALL)、possible_keys 与 key(候选及实际索引)、key_len(索引使用字节数)、rows(预估扫描行数)、filtered(条件过滤百分比)、Extra(额外信息如 Using index、Using filesort 等)。

sql explain 输出字段逐项解析

EXPLAIN 是 MySQL 中用于查看 SQL 查询执行计划的核心命令。理解其输出字段,是优化慢查询、识别性能瓶颈的关键一步。下面按 MySQL 8.0+ 常见输出列顺序,逐项说明含义、关键取值及实际判断要点。

id:查询中每个 SELECT 的唯一标识

表示 SELECT 的序列号,从 1 开始递增。相同 id 表示这些操作属于同一层级(如简单查询或 UNION 中的并列子句);不同 id 表示嵌套关系,id 越大越先执行(因为依赖外层结果)。常见情况:

  • 单个 SELECT:id 恒为 1
  • 子查询(非相关):内层 SELECT id 大于外层,如 (SELECT ... FROM (SELECT ...)) 可能出现 id=3→2→1
  • UNION:第一个 SELECT id=1,后续每个 UNION 分支 id 为 NULL,同时多一行额外记录显示 UNION RESULT

select_type:当前 SELECT 所处的逻辑位置

描述该行对应的是哪种类型的查询片段,直接影响执行方式和优化策略:

  • SIMPLE:不包含子查询、UNION 的普通 SELECT
  • PRIMARY:最外层的 SELECT(即使有子查询,它也是 PRIMARY)
  • SUBQUERY:在 SELECT 或 WHERE 中的非相关子查询(如 WHERE id IN (SELECT ...)),通常只执行一次
  • DERIVED:FROM 子句中的子查询(如 SELECT * FROM (SELECT ...) AS t),MySQL 会物化为临时表,type 常为 ALL,需警惕
  • UNION:UNION 中第二个及之后的 SELECT
  • UNION RESULT:为合并 UNION 结果而产生的虚拟行,不访问表,可忽略

table:当前操作访问的表名或别名

显示这一行计划作用于哪张表。可能的值包括:

  • 真实表名或别名(如 t1orders o
  • :表示来自第 N 个 DERIVED 子查询生成的临时表
  • :表示 UNION 合并的多个查询结果集(如
  • NULL:不访问任何表,例如常量连接(SELECT 1)或 UNION RESULT 行

type:连接类型,反映访问表数据的方式(性能排序由优到劣)

这是最关键的字段之一,直接体现是否用上索引、扫描范围有多大:

  • system:表只有一行(系统表),最快
  • const:主键或唯一索引等值匹配,且匹配到 1 行(如 WHERE id = 5
  • eq_ref:主键/唯一索引做 JOIN 时的高效连接(如 t1.id = t2.t1_id,t2.t1_id 有唯一索引)
  • ref:非唯一索引等值匹配(如 WHERE status = 'active',status 有普通索引)
  • range:索引范围扫描(如 WHERE id BETWEEN 10 AND 20WHERE created_at > '2023-01-01'
  • index:全索引扫描(遍历整棵 B+ 树),比 ALL 快(因不用回表读数据页),但仍是全量扫描
  • ALL:全表扫描,最差,应优先优化(检查是否缺索引、索引失效、或统计信息不准)

possible_keys 与 key:索引选择的实际路径

possible_keys 是优化器认为可用的索引列表(基于 WHERE 条件推断);key 是最终选定使用的索引名。

陌言AI
陌言AI

陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能

下载
  • possible_keys 为空 → 无可用索引,大概率要加索引或重写条件
  • key 为空但 possible_keys 非空 → 索引未被选用,常见原因:过滤性差(如低基数列)、统计信息过期、使用了函数/表达式(WHERE YEAR(create_time) = 2023)、隐式类型转换WHERE mobile = 13800138000,mobile 是字符串)
  • key 显示某索引,但 type 不理想(如 key=idx_status,type=ALL)→ 索引失效,需检查条件是否符合最左前缀,或是否存在 OR 导致索引跳过

key_len:实际用到的索引字节

用于判断联合索引中用了几列,以及是否涉及 NULL 或变长字段:

  • 数值越小不一定越好,但能验证索引使用深度。例如联合索引 (a, b, c)
     • key_len = 4 → 只用到了 a(假设 a 是 INT NOT NULL)
     • key_len = 9 → 用到了 a + b(b 是 VARCHAR(20),字符集 utf8mb4 下单字符最多 4 字节,但这里可能是 VARCHAR(10) + 1 字节长度标识)
  • 含 NULL 的列,每列额外 +1 字节(标记是否为 NULL)
  • 变长字段(VARCHAR、TEXT)会多出 1–2 字节长度信息

rows:预估需要扫描的行数

优化器基于统计信息估算的“这一行计划”将检查多少行。不是返回行数,而是访问开销指标:

  • 值越大,IO 和 CPU 成本越高;若远超实际结果集(如 rows=100000,但 SELECT COUNT(*) 只有 100 行),说明统计信息陈旧,可执行 ANALYZE TABLE tbl_name
  • 多个 JOIN 行的 rows 相乘,大致等于整体扫描量(如 t1.rows=100,t2.rows=500 → 总扫描量约 5 万次)
  • 注意:该值不包含过滤后剩余行数,仅指“进入该步骤需读取的行”,后续 WHERE 还会进一步筛选

filtered:该表条件过滤后的行数百分比(MySQL 5.7+)

表示经过 WHERE 条件(不含 JOIN 条件)后,保留的比例(0–100)。例如 filtered=10.00 表示只留下约 10% 的行。

  • 结合 rows 使用:rows × filtered / 100 ≈ 实际参与下一级的行数
  • 若 filtered 极低(如 WHERE gender = 'M'),即使走了索引,仍需大量回表或比较,考虑是否值得索引

Extra:补充说明,含大量性能线索

常见关键值及其含义:

  • Using index:覆盖索引,无需回表(SELECT 列全部命中索引),性能好
  • Using where:存储引擎返回数据后,Server 层还需额外过滤(常见于索引未覆盖 WHERE 全部条件)
  • Using index condition(ICP):索引条件下推,将部分 WHERE 下推到存储引擎层执行(如 WHERE a = 1 AND b > 10,a,b 有联合索引,b 的范围条件可在引擎层提前过滤),减少回表量
  • Using temporary:需创建临时表,常见于 GROUP BY、DISTINCT、UNION、某些 ORDER BY 场景,影响较大
  • Using filesort:无法利用索引完成排序,需额外排序操作(内存 or 磁盘),应尽量避免
  • Using join buffer(Block Nested Loop):未走索引的 JOIN,启用连接缓冲区,效率较低
  • Impossible WHERE:WHERE 条件恒假(如 WHERE 1=0),直接返回空

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1096

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

358

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

697

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 805人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号