EXPLAIN:要使用EXPLAIN,只需要在查询中的SELECT关键字之前增加EXPLAIN这个词。
EXPLAIN有两个主要变种:
1:EXPLAIN EXTENDED 看起来和正常的EXPLAIN的行为一样,但它会告诉服务器“逆向编译”执行计划为一个SELECT语句。可以通过紧接其后运行SHOW WARNINGS看到这个生成语句。适用于MySQL和更新版本。
2:EXPLAIN PARTITIONS会显示查询将访问的分区,如果查询是基于分区表的话。适用于MySQL5.1和更新版本。
EXPLAIN中的列:
ID列:这一列总是包含一个编号,标识SELECT所属的行。
select_type列:这一列显示了对应行是简单还是复杂SELECT。SIMPLE值意味着查询不包括子查询和UNION。如果查询有任何复杂的子部分,则最外层部分标记为PRIMARY,其他部分标记如下。
SUBQUERY:
包含在SELECT列表中的子查询中的SELECT标记为SUBQUERY。例:SELECT (SELECT a from user limit 1) from action;
还可被标记为DEPENDENT,DEPENDENT意味着SELECT依赖于外层查询中发现的数据。
DERIVED:
DERIVED值用来表示包含在FROM子句的子查询中的SELECT,MYSQL会递归执行并将结果放到临时表。
UNION:
在UNION中的第二个和随后的SELECT被标记为UNION。
UNION RESULT:
用来从UINON的匿名临时表检索结果的SELECT被标记为UNION RESULT。
table列:这一列显示了对应行正在访问哪个表。当在from子句中有子查询时,table列是<derivedN>的形式,其中N是子查询的id,N指向EXPLAIN输出中后面的一行。
type列:这一列意味着mysql如何查找表中的行。
ALL:全表扫描。
index:和全表扫描一样,只是MySQL扫描时按表索引次序进行而不是行。
range:范围扫描是一个有限制的索引扫描,开始于索引里的某一点,返回匹配这个值域的行。
ref:是一种索引访问,返回所有匹配某个单个值得行。
eq_ref:使用这种查找,MySQL知道最多只返回一条符合条件的记录。
const,system:当MySQL能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。
NULL:这种访问方式意味着MySQl能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引。
possible_keys列:这一列显示查询可以使用哪些索引。
key列:这一列显示了MySQl决定采用哪个索引来优化对该表的访问。
key_len列:该列显示了MySQl在索引里使用的字节数。
ref列:这一列显示了之前的表在key列记录的索引中查找所用的列或常量。
rows列:这一列是MySQL估计为了找到所需的行而要读取的行数。
filtered列:这一列是在MySQL5.1里新加进去的,在使用EXPLAIN EXTENED时出现。它显示旳是针对表里符合某个条件的记录数的百分比所做的一个悲观估计。
Extra列:这一列包含的是不适合在其他列显示的额外信息。
using index:表示使用了覆盖索引。
using temporary:这意味着MySQL在对查询结果排序时会使用一个临时表。
using where:这意味着MySQL服务器将在存储引擎检索行后再进行过滤。
using filesort:mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。