mysql--EXPLAIN输出分析

本文详细介绍了MySQL中explain的相关内容。explain可提供SELECT、DELETE等语句的解析,接着阐述了其输出格式,包括ID、SELECT TYPE、table等各项的含义,如possible_keys表示可选择的索引,key是实际使用的索引等,还给出了参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

explain提供 SELECT, DELETE, INSERT, REPLACE,和 UPDATE语句的解析。

explain输出格式

ColumnJSON NameMeaning
idselect_id显示 SELECT 标识符
select_typeNone显示 SELECT 类型
tabletable_name输出表的名称
partitionspartitions匹配的分区
typeaccess_type连接类型
possible_keyspossible_keys可能用到的索引或主键
keykey实际选择的索引或主键
key_lenkey_length所选索引或主键的长度
refref显示将哪些列或常量与列中指定的索引进行比较
rowsrowsmysql必须检查以执行查询的行数
filteredfiltered过滤百分比,100为不过滤
ExtraNone如何解析查询的其他信息

ID

SELECT标识符。这是SELECT查询中的序号 。如果行引用其他行的联合结果,则该值可以是NULL。在这种情况下,该 table列显示一个值 ,表示该行引用值为和的行的并集

SELECT TYPE

这里显示了选择的类型,对应上表的select_type

select_type ValueJSON NameMeaning
SIMPLENone简单的 SELECT查询 (未使用 UNION 或子查询)
PRIMARYNone最外面的 SELECT查询
UNIONNone第二个或更多 SELECT 语句在 UNION
DEPENDENT UNIONdependent (true)第二个或更多 SELECT 语句 UNION, 取决于外部查询
UNION RESULTunion_result返回 UNION的结果
SUBQUERYNone第一个 SELECT 是子查询
DEPENDENT SUBQUERYdependent (true)第一个 SELECT 在子查询, 取决于外部查询
DERIVEDNone派生表
MATERIALIZEDmaterialized_from_subquery物化子查询
UNCACHEABLE SUBQUERYcacheable (false)无法缓存结果的子查询,必须为外部查询的每一行重新计算
UNCACHEABLE UNIONcacheable (false)属于不可缓存的子查询的第二个或后一个选择的 UNION 语句

table

输出行引用的表的名称。这也可以是以下值之一:
<unionM,N>:行指的是id值为M和的行 的 并集 N。
:该行是指用于与该行的派生表结果id的值 N。例如,派生表可能来自FROM子句中的子查询 。
:行引用id 值为的行的具体化子查询的结果

partitions

查询将匹配记录的分区。该值适用NULL于非分区表

type

连接类型

TypeMeaning
system该表只有一行(=系统表) 这是const连接类型的特例
const最多只有一个匹配行,在查询开头读取,只读取一次
eq_ref对于每个行组合,从该表中读取一行
ref对于每个行组合,将从此表中读取具有匹配索引值的所有行。连接仅使用键的最左前缀的索引,不包括主键和唯一索引 使用 = or < = > 计算
fulltext使用FULLTEXT 索引执行连接。
ref_or_null这种连接类型像 ref,但除此之外,MySQL还会对包含NULL值的行进行额外搜索。此连接类型优化最常用于解析子查询
index_merge此连接类型表示使用了索引合并优化。在这种情况下,key输出行中的列包含使用的索引列表
unique_subquery一个索引查找功能,它可以完全替换子查询以提高效率 value IN (SELECT primary_key FROM
index_subquery类似于 unique_subquery。它替换IN子查询,但它适用于以下形式的子查询中的非唯一索引                           value IN (SELECT key_column FROM
range仅检索给定范围内的行,使用索引选择行 可使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()
index该index联接类型是一样的 ALL,只是索引树被扫描
ALL对前面表格中的每个行组合进行全表扫描

possible_keys

possible_keys列表示MySQL可以从中选择查找此表中的行的索引,如果为NULL,则没有相关索引

key

该key列指示MySQL实际决定使用的索引

key_len

该key_len列指示MySQL决定使用的索引的长度

ref

显示将哪些列或常量与列中指定的索引进行比较,以 key从表中选择行。

rows

指示MySQL认为必须检查以执行查询的行数。

filtered

指示将按表条件过滤的表行的估计百分比。最大值为100,这意味着不会对行进行过滤

Extra

包含有关MySQL如何解析查询的其他信息

Extra Meaning
Child of 'table' pushed join@1此表被引用为table可以下推到NDB内核的联接中的子代,仅当启用了下推式联接时,才适用于NDB群集
const row not found 对于诸如此类的查询,该表为空
Deleting all rows因为DELETE,某些存储引擎(例如MyISAM)支持一种处理程序方法,该方法以简单快捷的方式删除所有表行
DistinctMySQL正在寻找不同的值,因此它在找到第一个匹配行后停止为当前行组合搜索更多行。
FirstMatch半连接FirstMatch连接快捷方式策略用于tbl_name。
Full scan on NULL key 当优化程序无法使用索引查找访问方法时,子查询优化会作为回退策略发生这种情况。
Impossible HAVING 该HAVING子句始终为false,不能选择任何行。
Impossible WHERE 该WHERE子句始终为false,不能选择任何行。
Impossible WHERE noticed after reading const tablesMySQL已经读取了所有 const(和 system)表,并注意到该WHERE子句始终为false。
LooseScan(m..n)使用半连接LooseScan策略。 m并且 n是关键部件号。
No matching min/max row没有行满足查询的条件,例如 。 SELECT MIN(...) FROM ... WHERE condition
no matching row in const table对于具有连接的查询,有一个空表或没有满足唯一索引条件的行的表。
No matching rows after partition pruning对于DELETE或 UPDATE,优化器在分区修剪后没有发现任何删除或更新的内容。
No tables used查询没有FROM子句,或者有 FROM DUAL子句。
Not existsMySQL能够对LEFT JOIN 查询进行优化,并且在找到与LEFT JOIN标准匹配的行之后,不会检查此表中更多行以用于上一行组合
Plan isn't ready yetEXPLAIN FOR CONNECTION当优化程序尚未完成为在命名连接中执行的语句创建执行计划时, 会出现此值
Range checked for each recordMySQL发现没有好的索引可以使用,但发现在前面的表的列值已知之后可能会使用某些索引
Scanned N databases这表示服务器在处理INFORMATION_SCHEMA表查询时执行的目录扫描次数
Select tables optimized away优化器确定1)应该返回最多一行,以及2)为了产生该行,必须读取确定的行集
Skip_open_table, Open_frm_only, Open_full_table这些值表示适用于INFORMATION_SCHEMA 表查询的文件打开优化
Start temporary,End temporary这表示临时表用于半连接Duplicate Weedout策略。
unique row not found对于诸如的查询,没有行满足 索引或表的条件
Using filesortMySQL必须执行额外的传递以找出如何按排序顺序检索行。
Using index仅使用索引树中的信息从表中检索列信息,而不必执行额外的搜索以读取实际行。对于InnoDB具有用户定义的聚簇索引的表,即使列中Using index不存在 该索引,也可以使用该索引Extra,这样的话,如果 type是 index和 key是PRIMARY。
Using index condition通过访问索引元组并首先测试它们以确定是否读取完整的表行来读取表。
Using index for group-by与Using index表访问方法类似,Using index for group-by 表示MySQL找到了一个索引,可用于检索GROUP BY或 DISTINCT查询的所有列,而无需对实际表进行任何额外的磁盘访问。
Using join buffer将早期联接中的表分成几部分读入连接缓冲区,然后从缓冲区中使用它们的行来执行与当前表的连接
Using MRR使用多范围读取优化策略读取表
Using sort_union(...),Using union(...),Using intersect(...)这些指示特定算法显示如何为index_merge连接类型合并索引扫描
Using temporary要解析查询,MySQL需要创建一个临时表来保存结果
Using where甲WHERE子句用于限制匹配哪些行针对下一个表或发送到客户端。除非您特意打算从表中获取或检查所有行,否则如果Extra值不是 Using where并且表连接类型为ALL或者 ,则 查询中可能出现错误index。
Using where with pushed condition此产品适用于NDB 表只。这意味着NDB Cluster正在使用条件下推优化来提高非索引列和常量之间直接比较的效率。在这种情况下,条件被“ 下推 ”到集群的数据节点,并在所有数据节点上同时进行评估。这消除了通过网络发送不匹配行的需要,并且可以在可以但不使用条件下推的情况下将这种查询加速5到10倍。
Zero limit查询有一个LIMIT 0子句,不能选择任何行。

参考:

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值