Explain字段说明

一、id列

id列的标号是select的序列号,有几个select就有几个id,id列越大执行优先级最高,id相同则是从上往下执行,id为null则是最后执行。

Mysql将select查询分为简单查询(SIMPLE)和复杂查询(PIRMARY),而复杂查询又分为简单子查询,派生表(from语句中的子查询)union查询

二、select_type列

    select_type表示对应行是简单还是复杂查询,如果是复杂的查询,又是上述三中复杂查询的哪一种。

    1) simple :简单查询(查询不包含子查询和union)

    2) primary:复杂查询中最外层的select

    3) subquery:包含在select中的子查询(不在from子句中)

    4) derived:包含在from子句中的子查询,Mysql会将结果存放在一个临时表中,也称为派生表。

    5) union:在union中的第二个和随后的select中

    6) union result:从union临时表检索结果的select

三、table列

这一列表示explain的一行正在访问哪个表,当from子句有子查询时,table列是格式,表示当前查询依赖id=N的查询,于是先执行id=N的查询。当有union时,UNION

RESULT的table列的值为,1和2表示参与union的select行id。

四、type列

    这一列标识关联类型或者访问类型,即Mysql决定如何查找表中的行,查找数据行记录的大概范围。

    依次从最优到最差分别为:system > const  > eq_ref > ref > range > index > ALL

一般来说,得保证查询达到range 级别,最好达到ref

五、key列

    这一列现实mysql实际采用哪个索引来优化对该表的访问。如果没用索引,则该列为NULL。如果想强制mysql使用或忽视possible_key列中的索引,在查询中使用force_index/ignore_index。

六、key_len列

    这一列显示了mysql在索引里使用的字节数,通过这个值可以算出使用了索引中的哪些列。

key_len计算方法


    七、Extra列

        1)Using index:查询的列被索引覆盖,并且where筛选条件是索引的前导列,是性能高的表现,一般是使用了覆盖索引(索引包含了所有的查询字段)。对于innoDb来说,如果是辅助索引性能会有不少提高。

        2)Using where:查询的列未被索引覆盖,where筛选条件非索引的前导列。

        3)Using where Using index:查询的列未被索引覆盖,并且where筛选条件是索引列之一但不是索引的前导列,意味着无法直接通过索引查找到符合条件的数据。

        4)NULL:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引。

        5)Using index condition:与Using where类似,查询的列不完全被索引覆盖,where条件是一个前导列的范围。

        6)Using temporary:mysql需要创建一张临时表来出黎查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

        7)Using filesort :mysql会对结果使用一个外部索引排序,而不是按照索引次序从表里读取行。

你可能感兴趣的:(Explain字段说明)