explain详解
迪丽瓦拉
2025-05-29 00:01:57
0次

一、explain输出列

ColumnMeaning意义
idThe identifierSELECTSELECT的序列号
select_typeThe typeSELECTSELECT的类型
tableThe table for the output row输出行的表
partitionsThe matching partitions匹配的分区
typeThe join type联接类型
possible_keysThe possible indexes to choose供选择的可能索引
keyThe index actually chosen实际选择的索引
key_lenThe length of the chosen key所选键的长度
refThe columns compared to the index与索引比较的列
rowsEstimate of rows to be examined要检查的行的估计值
filteredPercentage of rows filtered by table condition按表条件筛选的行百分比
ExtraAdditional information其他信息

二、输出列详解

1.id

SELECT的序列号。

2.select_type

select_typeValueMeaning意义
SIMPLESimple SELECT(not using UNION or subqueries)简单SELECT(未使用UNION或子查询)
PRIMARYOutermost SELECT最外层SELECT
UNIONSecond or later SELECT statement in a UNIONUNION中的第二个或后面的SELECT语句
DEPENDENT UNIONSecond or later SELECT statement in a UNION, dependent on outer queryUNION中的第二个或后面的SELECT语句,取决于外部查询
UNION RESULTResult of a UNIONUNION的结果
SUBQUERYFirst SELECT in subquery子查询中的第一个SELECT
DEPENDENT SUBQUERYFirst SELECT in subquery, dependent on outer query子查询中的第一个SELECT,取决于外部查询
DERIVEDDerived table派生表
DEPENDENT DERIVEDDerived table dependent on another table依赖于另一个表的派生表
MATERIALIZEDMaterialized subquery具体化子查询
UNCACHEABLE SUBQUERYA subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query无法缓存其结果且必须为外部查询的每一行重新求值的子查询
UNCACHEABLE UNIONThe second or later SELECT in a UNION that belongs to an uncacheable subqueryUNION中属于不可缓存子查询的第二个或后面的SELECT

3.table

输出行引用的表的名称,也可以是以下值之一:

:M和N的行的并集。

:值为N的行的派生表结果。例如,来自子句中的子查询。

:值为N的行的实例化子查询的结果。

4.partitions

查询将从中匹配记录的分区。该值用于未分区的表。

5.type

以下列表描述了联接类型,从最佳类型到最差类型排序:

typeValue意义
system该表只有一行(=系统表)。这是常量联接类型的特殊情况。
const该表最多有一个匹配行,在查询开始时读取该行。因为只有一行,所以优化器的其他部分可以将该行中列的值视为常量。常量表非常快,因为它们只读取一次。
const用于将PRIMARY KEY或UNIQUE索引的所有部分与常量值进行比较。在以下查询中,tbl_name可以用作常量表:
SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref对于上一个表中的每一行组合,将从该表中读取一行。除了系统类型和常量类型之外,这是最好的联接类型。当连接使用索引的所有部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL索引时,使用该方法。
eq_ref可用于使用=运算符进行比较的索引列。比较值可以是常量,也可以是使用在此表之前读取的表中的列的表达式。在以下示例中,MySQL可以使用eq_ref连接来处理ref_table:
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref对于上一个表中的每一行组合,将从该表中读取具有匹配索引值的所有行。如果联接仅使用键的最左边前缀,或者键不是PRIMARY key或UNIQUE索引(换句话说,如果联接无法根据键值选择单行),则使用ref。如果所使用的键仅与少数行匹配,则这是一种良好的联接类型。
ref可用于使用=或<=>运算符进行比较的索引列。在以下示例中,MySQL可以使用ref联接来处理ref_table:
SELECT * FROM ref_table WHERE key_column=expr;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
fulltext使用FULLTEXT索引执行联接。
ref_or_null这种联接类型类似于ref,但MySQL会额外搜索包含NULL值的行。这种联接类型优化最常用于解析子查询。在以下示例中,MySQL可以使用ref_or_null连接来处理ref_table:
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge此联接类型表示使用了索引合并优化。在这种情况下,输出行中的键列包含使用的索引列表,而key_len包含使用索引的最长键部分列表。
unique_subquery此类型替换以下形式的某些IN子查询的eq_ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery只是一个索引查找函数,它完全替换了子查询以提高效率。
index_subquery此联接类型类似于unique_subquery。它替代了IN子查询,但它适用于以下形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range仅检索给定范围内的行,使用索引选择行。输出行中的键列指示使用的索引。key_len包含所使用的最长密钥部分。此类型的ref列为NULL。
当使用 =、<>、>、>=、<、<=、is NULL、<=>、BETWEEN、LIKE或IN()运算符 将键列与常量进行比较时,可以使用range:
SELECT * FROM tbl_name WHERE key_column = 10;
SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
index索引连接类型与ALL相同,只是扫描了索引树。这有两种方式:
·如果索引是查询的覆盖索引,并且可以用于满足表中所需的所有数据,则只扫描索引树。在本例中,Extra列显示Using index。仅索引扫描通常比ALL更快,因为索引的大小通常小于表数据。
·使用从索引中读取来执行全表扫描,以按索引顺序查找数据行。Uses index会显示在Extra列中。
当查询仅使用作为单个索引一部分的列时,MySQL可以使用此联接类型。
ALL对前一个表中的每一行组合进行全表扫描。如果该表是第一个未标记为const的表,这通常是不好的,并且在所有其他情况下通常是非常糟糕的。通常,您可以通过添加索引来避免ALL,该索引允许基于以前表中的常量值或列值从表中检索行。

6.possible_keys

供选择的可能索引。

7.key

实际使用的键(索引)。

8.key_len

使用的索引长度。

9.ref

该列表示将哪些列或常量与索引进行比较,以从表中选择行。

10.rows

MySQL认为执行查询必须检查的行数。对于InnoDB表,该数字只是估计值,并不总是准确的。

11.filtered

由表条件筛选的行的估计百分比。最大值100,意味着没有对行进行筛选。值从100减少表示过滤量增加。

12.Extra

其他信息。更多Extra信息请参考MYSQL官方手册。

附:MYSQL官方手册-EXPLAIN

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...