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连接类型的特例。 |