EXPLAIN命令

EXPLAIN命令

      EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法。这个功能有局限性,并不总会说出真相。

      调用EXPLAIN,只需要在查询SQL中的SELECT关键字之前增加EXPLAIN命令即可。

 EXPLAIN中的列

Column Meaning
id 标识SELECT所属的行,id越大优先执行,id相同自上而下执行。
select_type 查询类型:分为简单和复杂类型;复杂类型分为三类:简单子查询、派生表(在FROM字句中的子查询),以及UNION查询。
table 这一列显示正在访问哪张表。
type 访问类型,MYSQL决定如何查找表中的行。
possible_keys 可能选择的索引。
key 实际使用的索引。
key_len 索引里使用的字节数。
ref 哪一列或常数在查询中与索引键列一起使用。
rows MYSQL估计为了找到所需的行而要读取的的行数,通过把所有rows列的值相乘,可以粗略地估算出整个查询会检查的行数。
Extra 不适合在其他列显示的额外信息。

 select_type列

value Meaning
SIMPLE 简单查询,不包括子查询和UNION。
PRIMARY 如果查询有任何复杂的子部分,则最外层部分标记为PRIMARY。
UNION UNION中第二个语句或随后的SELECT被标记为UNION。
DEPENDENTUNION UNION中第二个语句或后面的语句,独立于外部查询。
UNIONRESULT UNION的结果。
SUBQUERY 包含在SELECT列表中的子查询SELECT标记为SUBQUERY。
DEPENDENT SELECT依赖于外层查询中发现的数据。
DEPENDENT SUBQUERY 子查询中第一个SELECT,独立于外部查询。
DERIVED 包含在FROM子句的子查询中的SELECT。
MATERIALIZED 物化子查询。
UNCACHEABLESUBQUERY 结果集不能被缓存的子查询,必须重新评估外层查询的每一行。
UNCACHEABLEUNION UNION中第二个语句或后面的语句属于不可缓存的子查询。

type列

value Meaning
All 全表扫描。
index 跟全表扫描一样,只是MYSQL扫描表时按索引次序进行而不是行。
range 使用索引检索给定范围内的行。有限制的索引扫描,开始于索引里的某一点,返回匹配这个值域的行。
ref 一种索引访问,访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。
ref_or_null ref之上的一个变体,MYSQL必须在初次查找的结果里进行第二次查找以找出NULL条目。
eq_ref 使用这种索引查找,最多只返回一条符合条件的记录,MYSQL只用主键或者唯一性索引时看到。
const 表最多只有一个匹配行,在查询开始时被读取。因为只有一个值,优化器将该列值视为常量。
system 表仅一行数据,这是const连接类型的特例。

猜你喜欢

转载自injavawetrust.iteye.com/blog/2409850