您的位置:首页 > 财经 > 金融 > MySQL EXPLAIN输出信息

MySQL EXPLAIN输出信息

2024/10/7 6:44:11 来源:https://blog.csdn.net/binbinxyz/article/details/142220651  浏览:    关键词:MySQL EXPLAIN输出信息

文章目录

  • id
  • select_type
  • table
  • partitions
  • type
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • filtered
  • Extra
  • 示例
    • 1. type=system
    • 2. type=const
  • 参考

MySQL中的EXPLAIN语句提供了有关MySQL如何执行语句的信息。EXPLAIN适用于SELECT、DELETE、INSERT、REPLACE和UPDATE语句。
例如:

> explain select * from employees;
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
|  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299025 |   100.00 | NULL  |
+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------+
1 row in set, 1 warning (0.00 sec)

那这些输出是什么意思呢?可以参考下表:

ColumnJSON NameMeaning
idselect_idThe SELECT identifier
select_typeNoneThe SELECT type
tabletable_nameThe table for the output row
partitionspartitionsThe matching partitions
typeaccess_typeThe join type
possible_keyspossible_keysThe possible indexs to choose
keykeyThe index actually chosen
key_lenken_lengthThe length of the chosen key
refrefThe columns compared to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraNoneAdditional information

id

SELECT标识符。这是查询中SELECT的序列号。如果该行引用其他行的并集结果,该值可以为NULL。

select_type

SELECT的类型,可能的取值如下表:

ValueJSON NameMeaning
SIMPLENoneSimple SELECT(not using UNION or subqueries)
PRIMARYNoneOutermost SELECT
UNIONNoneSecond or later SELECT statement in a UNION
DEPENDENT UNIONdependent(true)Second or later SELECT statement in a UNION, dependent on outer query
UNION RESULTunion_resultResult of a UNION
SUBQUERYNoneFirst SELECT in subquery
DEPENDENT SUBQUERYdependent(true)First SELECT in subquery, dependent on outer query
DERIVEDNoneDerived table
DEPENDENT DERIVEDdependent(true)Derived table dependent on another table
MATERIALIZEDmaterialized_from_subqueryMaterialized subquery
UNCACHEABLE SUBQUERYcacheable(false)A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
UNCACHEABLE UNIONcacheable(false)The second or later select in a UNION that belongs to an uncacheable subquery(see UNCACHEABLE SUBQUERY)

table

输出行所引用的表的名称。也可能是如下值:

  • < unionM,N >
  • < derivedN >
  • < subqueryN >

partitions

查询从哪个分区匹配到的记录。如果不是分区表,那么该返回的值为NULL。

type

Join类型。其取值从最优到最差依次为:
null > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge> unique_subquery > index_subquery > range > index > ALL

  • NULL: 这种访问方式意味着MySQ能在优化阶段分解查询语句,在执行阶段甚至不需要再访问表或者索引。例如,从一个索引列里选取最小值可以通过单独查询索引来完成,不需要在执行时访问表。
  • system:查询的数据表中只有一行数据,是const类型的特例
  • const:常量级别,表中最多只匹配一行且在查询开始的时候就被读取到了。这种情况就是 PRIMARY KEY 或 UNIQUE。
  • eq_ref: 使用这种索引查找,MySQL清楚的知道最多只返回一条符合条件的记录,使用主键或者唯一值索引查找时能看到这种方法。MySQL对于这种访问类型的优化做得非常好,因为它知道到无需估计匹配行的范文或者在找到匹配+ 行后再继续查找(因为值不会重复)。
  • ref: 索引访问,也叫索引查找。返回所有匹配某个单个值的行,然而它可能会找到符合条件的多个行。此类索引访问只有当使用非唯一性索引或者唯一索引的非唯一性前缀时才会发生。把他叫ref是因为他要和某个参考值相比较。+ 这个参考值或者是一个常数,或者来自多表查询前一个表里的结果值
  • fulltext:当查询条件使用了全文索引时,type的取值为fulltext
  • ref_or_null:类似于ref,但是当查询语句的连接条件或者查询条件包含的列有NULL值时,MySQL会进行额外查询,经常被用于解析子查询。典型的场景为 is null
  • index_merge: 当查询语句使用索引合并优化时,type的取值为index_merge。此时,key列会显示使用到的所有索引,key_len显示使用到的索引的最长键长值
  • unique_subquery: 当查询语句的查询条件为IN的语句,并且IN语句中的查询字段为数据表的主键或者非空唯一索引字段时,type的取值为unique_subquery。
  • index_subquery: 与unique_subquery类似,但是IN语句中的查询字段为数据表中的非唯一索引字段。
  • range: 范围扫描,就是一个有限制的索引扫描,使用一个索引来检索给定范围的行,不需要遍历全部索引。范围扫描通常出现在between,>,<,>=等操作中。in()和OR也会显示范围扫描,但这两者其实是不同的访问类型,性能上+ 也有差异。此类查找的开销根ref索引访问的开销相当。
  • index:跟全表扫描一样,只是MySQL扫描表时按照索引次序进行而不是行,主要优点是避免了排序;缺点是要承担按索引次序读取整个表的开销。
  • ALL:全表扫描,从头到尾的查找所需要的行。但仍然存在例外,例如使用了 LIMIT ,或者Extra 列中显示 Using distinct/not exists。

possible_keys

可能使用的索引。如果是NULL则表示不存在索引,此时需要检查一下表是否真的不需要索引。

key

表示MySQL实际决定使用的键(索引)

key_len

MySQL决定使用的索引的长度。

ref

显示将哪些列或常量与键列中命名的索引进行比较,以便从表中选择行。

rows

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

该值是MySQL预测的检索的行数,而不是结果的行数

filtered

用表的条件过滤表的行数据的百分比,最大值是100。

Extra

MySQL如何解析查询的其他信息。参考如下信息:

  • Using index:表示MySQL将使用覆盖索引,这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。
  • Using index condition:在5.6版本后加入的新特性索引下推(Index Condition Pushdown,ICP),在索引遍历过程中,对索引中包含的字段先做判断(即使该字段没有使用到索引),直接过滤掉不满足条件的记录,减少回表次数。
  • Using where:意味着MySQL服务器将在存储引擎检索行后再进行过滤。就是先通过索引读取整行数据,再按 WHRER条件进行检查,符合就留下,不符合就丢弃。查询的列未被索引覆盖。
  • Using temporary:MySQL需要创建一张临时表来中间结果并进一步处理,比如union、group by、distinct等,出现这种情况一般是要进行优化的,首先是想到用索引来优化。
  • Using filesort:MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行,即filesort(文件排序)。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。filesort有两种,一种是内存排序,一种是磁盘排序,无法得知。
  • Distinct: 一旦MySQL找到了与行相联合匹配的行,就不再搜索了,常见于关联查询。
  • No tables used:Query语句中使用from dual 或不含任何from子句。
  • Using join buffer:使用了连接缓存,join语句用到了缓冲区。

示例

1. type=system

CREATE TABLE t(id int) Engine=MyISAM;
INSERT INTO t VALUES(1);
EXPLAIN SELECT * FROM t;

2. type=const

> desc employees;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no     | int           | NO   | PRI | NULL    |       |
| birth_date | date          | NO   |     | NULL    |       |
| first_name | varchar(14)   | NO   |     | NULL    |       |
| last_name  | varchar(16)   | NO   |     | NULL    |       |
| gender     | enum('M','F') | NO   |     | NULL    |       |
| hire_date  | date          | NO   |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)> explain select * from employees where emp_no = 10001;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | employees | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

参考

  • MySQL官方文档:EXPLAIN Output Format
  • mysql EXPLAIN命令的输出列简介
  • MySQL】explain 执行计划输出格式说明(详细版)
  • MySql explain命令返回结果详细介绍

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com