explain
explain 只能解释select查询,并不会对存储过程、insert、update、delete或其他语句做解释。可以通过重写非select查询,来利用explain
参数解释
id
标示select所属的行,如果在语句中没有子查询或者联合,那么只会有唯一的select
select_type
这一列显示了对应行是简单还是复杂。
-
SIMPLE
simle 意味着查询不包含子查询或者联合,如查询包含任何复杂的子查询,则最外层被标记为primary -
SUBQUERY
包含在select中的子查询,被标记为subquery。意思是不再from子句中 -
DERIVED
derived值表示包含在from子句的子查询中的select。 -
UNION
在union中的第二个和随后的select被标记为union -
UNION 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将对结果使用一个外部索引排序,而不是按索引次序读取。
网友评论