Mysql中explain分析sql查询含义
EXPLAIN
输出字段及其含义
-
id
-
含义:表示查询的序列号,用于标识查询的顺序。
-
可能的值:
-
正整数:表示查询的顺序,值越小表示越先执行。
-
NULL:表示该行是
EXPLAIN
的扩展信息,通常用于UNION
查询。
-
-
-
select_type
-
含义:表示查询的类型。
-
可能的值:
-
SIMPLE:简单查询,不包含子查询或
UNION
。 -
PRIMARY:最外层的查询。
-
SUBQUERY:子查询中的第一个
SELECT
。 -
DERIVED:派生表(
FROM
子句中的子查询)。 -
UNION:
UNION
中的第二个及后续SELECT
。 -
UNION RESULT:
UNION
的结果。
-
-
-
table
-
含义:表示当前行所对应的表。
-
可能的值:
-
表名:实际的表名。
-
<derivedN>:表示派生表(子查询的结果)。
-
<subqueryN>:表示子查询的结果。
-
-
-
partitions
-
含义:表示查询涉及的分区信息(如果表是分区表)。
-
可能的值:
-
NULL:表不是分区表。
-
分区名:查询涉及的分区名称。
-
-
-
type
-
含义:表示访问表的方式,也称为访问类型。
-
可能的值:
-
system:表只有一行数据,是最优的访问方式。
-
const:通过主键或唯一索引直接访问表中的一行数据。
-
eq_ref:对于每个来自前一个表的行,从该表中读取一行数据。通常用于主键或唯一索引的等值查询。
-
ref:对于每个来自前一个表的行,从该表中读取所有匹配的行。通常用于非唯一索引的等值查询。
-
range:只检索给定范围内的行,通常用于
WHERE
子句中的范围查询。 -
index:全索引扫描,扫描整个索引。
-
ALL:全表扫描,扫描整个表。
-
-
-
possible_keys
-
含义:表示可能使用的索引。
-
可能的值:
-
索引名:可能使用的索引名称。
-
NULL:没有可用的索引。
-
-
-
key
-
含义:表示实际使用的索引。
-
可能的值:
-
索引名:实际使用的索引名称。
-
NULL:没有使用索引。
-
-
-
key_len
-
含义:表示实际使用的索引长度(以字节为单位)。
-
可能的值:
-
具体数值:表示索引的长度。
-
NULL:没有使用索引。
-
-
-
ref
-
含义:表示与索引列比较的值(通常是常量或来自其他表的列)。
-
可能的值:
-
常量值:如
const
。 -
其他表的列名:如
table1.column1
。 -
NULL:没有使用索引或没有比较值。
-
-
-
rows
-
含义:表示MySQL认为必须扫描的行数。
-
可能的值:
-
具体数值:表示估算的行数。
-
NULL:通常不会出现。
-
-
-
filtered
-
含义:表示在表扫描中,通过
WHERE
子句过滤的行的百分比。 -
可能的值:
-
0.00:没有过滤。
-
100.00:所有行都被过滤。
-
其他百分比值:表示过滤的行的比例。
-
-
-
Extra
-
含义:提供额外的查询执行信息。
-
可能的值:
-
Using index:表示使用了覆盖索引,无需回表查询。
-
Using where:表示使用了
WHERE
子句过滤行。 -
Using temporary:表示MySQL需要创建一个临时表来存储中间结果。
-
Using filesort:表示MySQL需要额外的排序操作。
-
Using join buffer:表示使用了连接缓冲区。
-
Using index condition:表示使用了
Index Condition Pushdown
优化。 -
Using MRR:表示使用了多范围读取优化。
-
Using rowid filter:表示使用了行ID过滤。
-
Using index for group-by:表示使用了索引进行分组操作。
-
Using index for order by:表示使用了索引进行排序操作。
-
NULL:没有额外信息。
-
-
示例
假设有一个表orders
,包含以下字段:order_id
(主键)、customer_id
、order_date
和amount
。执行以下查询并使用EXPLAIN
分析:
EXPLAIN SELECT order_id, amount FROM orders WHERE customer_id = 10 AND order_date > '2023-01-01';
可能的EXPLAIN
输出:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | orders | NULL | range | PRIMARY, idx_customer | idx_customer | 4 | const | 100 | 50.00 | Using where |
-
id: 查询的序列号,这里是
1
,表示这是一个简单的查询。 -
select_type:
SIMPLE
,表示这是一个简单查询。 -
table:
orders
,表示查询的表。 -
partitions:
NULL
,表示表不是分区表。 -
type:
range
,表示使用了范围查询。 -
possible_keys:
PRIMARY, idx_customer
,表示可能使用的索引包括主键和customer_id
的索引。 -
key:
idx_customer
,表示实际使用的索引是customer_id
的索引。 -
key_len:
4
,表示索引的长度为4字节。 -
ref:
const
,表示比较的值是常量。 -
rows:
100
,表示MySQL估计需要扫描100行。 -
filtered:
50.00
,表示通过WHERE
子句过滤掉50%的行。 -
Extra:
Using where
,表示使用了WHERE
子句过滤行。
通过理解这些字段及其值的含义,可以更好地优化查询和索引设计。