explain
explain 只能解释select查询,并不会对存储过程、insert、update、delete或其他语句做解释。可以通过重写非select查询,来利用explain
参数解释
id
标示select所属的行,如果在语句中没有子查询或者联合,那么只会有唯一的select
select_type
这一列显示了对应行是简单还是复杂。
SIMPLE
simle 意味着查询不包含子查询或者联合,如查询包含任何复杂的子查询,则最外层被标记为primarySUBQUERY
包含在select中的子查询,被标记为subquery。意思是不再from子句中DERIVED
derived值表示包含在from子句的子查询中的select。UNION
在union中的第二个和随后的select被标记为unionUNION RESULT
用来标记union 的匿名临时表检索结果的select
table
显示对应行正在访问的表。即表名 或者是表的别名
type
访问类型,mysql决定如何查找表中的行 从最差到最优 ALL、INDEX、RANGE、REF、eq_ref、const、system、NULL
ALL
全表扫描,通常意味着mysql必须扫描整张表,从头到尾去找需要的行。index
这个跟全表扫描一样,只是mysql扫描表时,按索引的次序进行。主要的优点是避免了排序,最大缺点是按索引顺序读表,开销很大。range
范围扫描就是一个有限制的索引扫描。它开始于索引的某个点,返回匹配这个值域的行。ref
索引访问,它返回匹配某个值的行。eq_ref
使用这个索引查找,mysql知道最多只返回一条符合记录的条件。在使用唯一索引或主键查找时,能够看到。const,system
当mysql能对查询的某部分进行优化并转换成一个常量时,它就会使用这些访问类型。null
这种访问方式意味着mysql能在优化阶段分解查询语句,在执行阶段甚至不再需要访问表或者索引。
possilble_keys
这一列显示了查询可以使用到的哪些索引。
key
这一列显示了mysql决定使用哪个索引来优化对该表的访问
key_len
该列显示了mysql在索引里使用的字节数
ref
这一列显示了之前的表在key列记录的索引中查找值所用的列或常量。
rows
这一列显示了mysql为了找到所需的行而需要读取的行数
extra
这一列包含了不适合在其他列显示的信息
using index
表示mysql将使用索引覆盖,以避免访问表using where
表示mysql服务器将在存储引擎检索行后再进行过滤using temporary
表示mysql 在对查询结果排序时使用了临时表。using filesort
mysql将对结果使用一个外部索引排序,而不是按索引次序读取。