参考:《高性能mysql》附录D EXPLAIN mysql
MySql将Select查询分为简单和复杂类型,复杂类型分为3大类:简单子查询,所谓的派生表(在派生表的子查询),以及UNION查询。sql
该列包含一个编号,标识SELECT所属的行。服务器
该列显示了对应行是简单仍是复杂的select(若是是后者,那么是三种复杂类型中哪种)。性能
simple:查询不包括子查询和UNION。优化
primary:若是查询有任何复杂的子部分,则最外层标记为primary。spa
subquery:包含在select列表中的子查询中的select(换句话说,不在from子句中)标记为subquery。code
derived:用来标识包含在from子句的子查询中的select,mysql会递归执行并将结果放到一个临时表中。服务器称其为派生表,由于该表是从子查询派生而来的。blog
union:在union中的第二个和随后的select被标记为union。第一个select被标记就好像它以部分外查询来执行。排序
union result:用来从union匿名临时表检查结果的select被标记为union result。递归
显示了对应行正在访问那个表。在一般状况下,它就是那个表,或是该表的别名。
访问类型---mysql决定如何查找表中的行。(从差到优)
all:全表扫描,一般意味着Mysql必须扫描全表,从头至尾,去找到须要的行。(这里有个例外,在查询中使用了limit,或者在extra列中显示‘Using distinct/not exists’)。
index:这个和全表扫描同样,只是mysql扫描表时按索引次序进行而不是行。它的主要优势是避免了排序;最大的缺点就是要承担按索引次序读取整个表的开销。这一般意着如果按照随机次序访问行,开销将会很是大。若是在extra列中看到‘using index’,说明MySql正在使用覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少得多。
range:范围扫描就是一个有限制的索引扫描,它开始于索引的某一点,返回匹配这个值域的行。它比全索引好一些,由于它不用遍历所有索引。显而易见的范围扫描是带有between或在where子句里带有>的查询。
ref:这是一种索引访问(有时也叫作索引查找),它返回全部匹配某个单个值的行。然而,它可能会找到多个符合条件的行,所以,它是查找和扫描的混合体。此类索引访问只有当使用非惟一性索引或者惟一性索引的非惟一性前缀时才会发生。把它叫作ref是由于索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询钱一个表里的结果值。 ref-null是ref之上的一个变体,它意味着MySql必须在楚辞查找的结果里进行第二次查找以找出NULL条目。
eq-ref:MySql知道最多只返回一条符合条件的记录。这种访问方法能够在MySql使用主键或者惟一性索引查找时看到,它会将它们与某个参考值做比较。MySQL对于这类访问类型的优化作的很是好,由于它知道无需估计匹配行的范围或在匹配行后再继续查找。
explain select tb_order.*,tb_user.username from tb_order INNER JOIN tb_user on tb_order.user_id = tb_user.id
结果:
const,system:当MySql能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。举例来讲,若是你将某一行的主键放入where子句里的方式来选取此行的主键,mysql就能把这个查询转化为一个常量。经常使用于primary key 和 unique 索引的查询。
null:这种访问方式意味着MySql能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。例如,从一个索引列里选取最小值能够经过单独查找索引来完成,不须要再执行时访问表。
这一列显示了查询可使用哪些索引,这是基于查询访问的列和使用的比较操做符来判断的。这个列表是在优化过程的早期建立的,所以有些罗列出来的索引可能对于后续优化过程是没用的。
这一列显示了MySql决定采用哪一个索引来优化对该表的访问。若是该索引没有出如今possible_keys列中,那么MySql选用它是出于另外的缘由---例如,它可能选择了一个覆盖索引,哪怕没有where 子句。
possible_keys揭示了哪个索引能有助与高效地行查找,而key显示的是优化采用哪个索引能够最小化查询成本。
该列显示了MySql在索引里使用的字节数。
显示使用哪一个列或常数与key一块儿从表中选择行。
显示MySQL认为它执行查询时必须检查的行数。这个数字是内嵌循环关联计划里的循环数目。也就是说它不是MySql认为它最终要从表里读取出来的行数,而是MySql为了找到符合查询的每一点上标准的那些行而必须读取的行的平均数。
显示的是针对表里符合某个条件(where子句或联接条件)的记录数的百分比所作的一个悲观估算。把rows列和这个百分比相乘,就能看到MySql估算它将和查询计划里前一个表关联的行数。
这一列包含的是不适合在其余列显示的额外信息。