如何理解MySQL的Explain结果输出项

说明

在MySQL中,Explain是一种查询执行分析的方式,用于查看一个查询语句执行的计划和开销,以及表和索引的使用情况。通过在查询语句前添加Explain关键字,可以输出查询执行的详细信息。Explain的输出结果包含多个字段,每个字段都提供了有关查询执行计划的信息。

Explain输出结果

Explain结果输出包含多个属性字段,主要包括id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra等。其中,id是一个唯一的查询序列号,用于区分不同的查询,select_type描述了查询类型,table是查询涉及的表名称,type是访问类型,possible_keys是可能使用的建立索引的键列表,key是实际使用的索引名称,key_len是索引长度,ref是匹配的索引列与常量之间的比较条件,rows表示匹配的行数,Extra包含其他有关查询的信息等。Explain结果是在一张表格中逐行输出的。

Explain输出字段解释

1、id:id字段是一个唯一的查询序列号,可用于区分不同的查询。如果一个查询包含更多的子查询,那么在每一个子查询中都会分配一个唯一的id值;

2、select_type:描述了查询的类型,主要分为以下几种:
  – SIMPLE:指没有子查询或者UNION操作的简单SELECT
  – PRIMARY:表示最外层的查询
  – UNION:指UNION中第二个查询之后的查询
  – SUBQUERY:指在WHERE或HAVING子句中出现的子查询
  – DEPENDENT SUBQUERY:与SUBQUERY类似,但是子查询依赖于外部的查询
  – DERIVED:表示从FROM子句中的子查询导出的临时表
  – MATERIALIZED:virtual和materialized表示一个派生表是或者不是使用了materialization技术来优化查询

3、table:table字段表示查询涉及的表名称,如果查询使用了表别名,则会显示别名,多表关联时,该字段会出现多次;

4、type:访问类型,是查询性能关键的字段之一,其值代表MySQL在表中查找行的方式。MySQL中访问类型大致可以分为以下几类:
  – ALL:扫描全表,通常表记录数比较少时使用;
  – index:用非唯一索引匹配所有行,通常比ALL快,当索引为覆盖索引时,仅需访问索引而不访问数据记录;
  – range:根据索引查找一些行,索引范围查找,常见于利用索引来进行分页查询;
  – ref:匹配到了某个索引字段,但是可能会扫描的比较多,适用于多表关联查询的情况;
  – eq_ref:类似于ref,区别在于该语句只会查找一个满足匹配条件的索引行,比如唯一索引、主键索引等;
  – const:当通过索引一次就可以找到记录时使用,比如主键索引;
  – system:当查询表仅有一条记录时使用;
  – NULL:表示该字段尚未优化(即在查询过程中出现的结果),或者无效的测试,通常查询中使用了外关联查询,或者查询中使用了子查询等情况,当某个表的第一行被访问时,该表经常从系统表中读取信息。

5、possible_keys:表示所有可能用到的索引,通常只在索引失效或被忽略的情况下出现;

6、key:标记MySQL所选择的索引,如果该项为NULL,则意味着没有用到索引,而是执行全表扫描的操作;

7、key_len:表示使用索引的长度,如果MySQL决定使用联合索引,那么该值表示使用的所有联合索引的最大值;

8、ref:描述索引的哪一列或常量与key配合使用;

9、rows:是估计要扫描的记录条数,但并不是实际的执行结果,因为该结果并不是由完整的查询进行的,而仅仅是查询计划的估算值;

10、Extra:是提供有关MySQL如何执行查询的额外的信息,主要包括以下几种类型:
  – Using filesort:表示MySQL无法利用索引完成的排序;
  – Using temporary:表示MySQL需要创建一个临时表来完成查询;
  – Using index:表示查询利用了覆盖索引(Covering Index);
  – Using where:表示MySQL需要在存储引擎外部进行过滤,即对结果集中的行进行跟过滤条件的对比,过滤掉那些不满足条件的行,得到符合条件的结果集。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享