执行计划(query Execution plan
)segmentfault
explain select * from table
缓存
expain出来的信息有10列,
分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra
,下面对这些字段出现的可能进行解释:性能
SQL执行的顺序的标识,SQL从大到小的执行优化
示查询中每一个select子句的类型code
SIMPLE
:简单的SELECT,不实用UNION或者子查询。PRIMARY
:最外层SELECT。UNION
:第二层,在SELECT以后使用了UNION。DEPENDENT UNION
:UNION语句中的第二个SELECT,依赖于外部子查询。UNION RESULT
:UNION的结果。SUBQUERY
:子查询中的第一个SELECT。DEPENDENT SUBQUERY
:子查询中的第一个SELECT,取决于外面的查询。DERIVED
:导出表的SELECT(FROM子句的子查询)MATERIALIZED
:物化子查询UNCACHEABLE SUBQUERY
:没法缓存结果的子查询,必须为外部查询的每一行从新计算UNCACHEABLE UNION
:UNION 属于不可缓存的子查询的第二个或后一个选择输出行引用的表的名称。这也能够是如下值之一:索引
表示MySQL在表中找到所需行的方式,又称“访问类型”。get
经常使用的类型有: NULL, system, const, eq_ref, ref, range, index, ALL(从左到右,性能从差到好)
如下列表描述了从最佳类型到最差类型的链接类型it
const
该表最多只有一个匹配行,在查询开头读取。由于只有一行,因此优化器的其他部分能够将此行中列的值视为常量。 const表很是快,由于它们只读一次。io
eq_ref
对于前面表格中的每一个行组合,从该表中读取一行。除了 system和 const类型以外,这是最好的链接类型。当链接使用索引的全部部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引时使用它。table
ref_or_null
```SELECT * FROM ref_table WHERE key_column IS NULL; ```index_merge
该指数合并访问方法检索与多行 range扫描和他们的结果合并到一个。此访问方法仅合并来自单个表的索引扫描,而不扫描多个表。合并能够生成其基础扫描的联合,交叉或交叉联合
unique_subquery
此类型替换 如下形式的eq_ref某些 IN子查询:
index_subquery
此链接类型相似于 unique_subquery。它替换IN子查询,但它适用于如下形式的子查询中的非惟一索引:
index
该index联接类型是同样的 ALL,只是索引树被扫描。这种状况有两种:
该possible_keys列指示MySQL能够选择在此表中查找行的索引,指出MySQL能使用哪一个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不必定被查询使用
该列彻底独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
若是该列是NULL,则没有相关的索引。在这种状况下,能够经过检查WHERE子句看是否它引用某些列或适合索引的列来提升你的查询性能。若是是这样,创造一个适当的索引而且再次用EXPLAIN检查查询
key列显示MySQL实际决定使用的键(索引)
若是没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并不是实际使用长度,即key_len是根据表定义计算而得,不是经过表内检索出的)
不损失精确性的状况下,长度越短越好
表示上述表的链接匹配条件,即哪些列或常量被用于查找索引列上的值
表示MySQL根据表统计信息及索引选用状况,估算的找到所需的记录所须要读取的行数
该Extra列 EXPLAIN输出包含MySQL解决查询的额外信息。如下列表说明了此列中可能出现的值。每一个项目还指示JSON格式的输出哪一个属性显示Extra值。对于其中一些,有一个特定的属性。其余显示为message 属性的文本
记录将与查询匹配的分区。仅在使用PARTITIONS关键字时才显示此列 。非分区表显示null