一、explain输出列
Column | Meaning | 意义 |
---|---|---|
id |
The identifierSELECT |
SELECT 的序列号 |
select_type |
The typeSELECT |
SELECT 的类型 |
table |
The table for the output row | 输出行的表 |
partitions |
The matching partitions | 匹配的分区 |
type |
The join type | 联接类型 |
possible_keys |
The possible indexes to choose | 供选择的可能索引 |
key |
The index actually chosen | 实际选择的索引 |
key_len |
The length of the chosen key | 所选键的长度 |
ref |
The columns compared to the index | 与索引比较的列 |
rows |
Estimate of rows to be examined | 要检查的行的估计值 |
filtered |
Percentage of rows filtered by table condition | 按表条件筛选的行百分比 |
Extra |
Additional information | 其他信息 |
二、输出列详解
1.id
SELECT
的序列号。
2.select_type
select_type Value |
Meaning | 意义 |
---|---|---|
SIMPLE |
Simple SELECT (not using UNION or subqueries) |
简单SELECT (未使用UNION 或子查询) |
PRIMARY |
Outermost SELECT |
最外层SELECT |
UNION |
Second or later SELECT statement in a UNION |
UNION 中的第二个或后面的SELECT 语句 |
DEPENDENT UNION |
Second or later SELECT statement in a UNION , dependent on outer query |
UNION 中的第二个或后面的SELECT 语句,取决于外部查询 |
UNION RESULT |
Result of a UNION |
UNION 的结果 |
SUBQUERY |
First SELECT in subquery |
子查询中的第一个SELECT |
DEPENDENT SUBQUERY |
First SELECT in subquery, dependent on outer query |
子查询中的第一个SELECT ,取决于外部查询 |
DERIVED |
Derived table | 派生表 |
DEPENDENT DERIVED |
Derived table dependent on another table | 依赖于另一个表的派生表 |
MATERIALIZED |
Materialized subquery | 具体化子查询 |
UNCACHEABLE SUBQUERY |
A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query | 无法缓存其结果且必须为外部查询的每一行重新求值的子查询 |
UNCACHEABLE UNION |
The second or later SELECT in a UNION that belongs to an uncacheable subquery |
UNION 中属于不可缓存子查询的第二个或后面的SELECT |
3.table
输出行引用的表的名称,也可以是以下值之一:
<unionM,N>:M和N的行的并集。
4.partitions
查询将从中匹配记录的分区。该值用于未分区的表。
5.type
以下列表描述了联接类型,从最佳类型到最差类型排序:
type Value |
意义 |
---|---|
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
标签:column,explain,索引,详解,key,table,ref,SELECT From: https://www.cnblogs.com/pingcode/p/17222105.html