MySQL性能调优之explain参数详解

    技术2026-04-14  4

    参数列表

    1.id

    1.1 id相同情况

    id相同的情况,执行顺序由上至下,那么就是先加载t1,然后加载t3,最后加载t2。

    1.2 id不同的情况

    id不同的情况,id值越大的越先被执行,先加载子查询t3表,再执行t1表,最后加载t2表。

    1.3 id相同又不同的情况

    id相同的可以认为是一组,顺序由上至下执行,针对此例先加载t3表,然后加载derived2表,derived为衍生的意思,后面的2指的是id为2的子查询(括号中的虚表),

    2.select_type

    2.1 simple

    简单的select查询,不包含子查询、union等。

    2.2 primary

    查询中若含有子查询,则最外一层标记为primary,见1.1、1.2例子

    2.3 subquery

    在select或者where中包含子查询。

    2.4 derived

    在from中包含子查询被标记为derived,MySQL会递归查询,把结果放在临时表中。

    2.5 union

    若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select则被标记为derived。

    2.6 union result

    从union中获取结果的select

    3.table

    这个不用过多解释,就是表示是哪张表。

    4.type

    包含了以上8种类型,这8种类型顺序system>const>eq_ref>ref>range>index>all,一般来说至少要达到range级别,最差也要达到index。

    4.1 system

    一般为MySQL系统表,开发中实际用不到。

    4.2 const

    表示通过一次索引就找到了,一般用于primary key或者unique索引,因为只匹配一行数据,所以很快,如果将主键置于where列表中,MySQL就能将其转化成一个常量。

    4.3 eq_ref

    唯一性索引扫描,表中只有一条数据与之匹配,常见于主键或者唯一索引扫描。

    4.4 ref

    非唯一索引扫描,返回匹配值的所有行。

    4.5 range

    检索给定的范围行,一般用于where中的between、<、>、in等查询。

    4.6 index

    只遍历索引树,索引文件通常比数据文件小,all是从硬盘读。例:select id from t1;

    4.7 all

    全表扫描。例 select * from t1;

    5.possible_keys

    可能用到的索引,一个或者多个,不一定实际使用到。

    6.key

    实际使用到的索引,如果为null,则没有用到索引。

    覆盖索引,如果select后面的字段刚好和建立索引的字段个数、顺序都能对应上,则使用索引,例:

    7.key_len

    表示索引中使用的字节数,在不损失精度的前提下,长度越短越好。

    8.ref

    显示索引的哪一列被使用了,例:

    t1表的col1匹配t2表的col1,col2匹配了一个常量,即‘ac’。

    9.rows

    根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,例:

    先加载t1表的640行记录,然后与t2表进行匹配,有一条记录匹配,前面的type字段为eq_ref。

    10.Extra

    不适合在其他列展示,但是比较重要的信息。

    10.1 using filesort 文件内排序

    对比下图,我们发现,上图多了一个using filesort信息,原因是因为我们建的索引为idx_col1_col2_col3,但是sql语句中的查询条件,where col1 = ‘ac’,order by col3,中间断了一层col2,MySQL用了文件内排序重新执行了一遍sql,而下图col1、col2、col3都用上了,没有断,就没有文件内排序,这种情况我们要注意,尽量不要发生using filesort。

    10.2 using temporary

    使用了临时表保存结果,常见于order by 和 group by。例:

    建立的索引为col1和col2组合索引,但是group by的是单独col2,MySQL会内部产生一个临时表去进行分组,非常耗费资源,所以我们group的时候要根据索引的个数和顺序来。

    10.3 using index

    覆盖索引,直接从索引文件读取数据,没有回表查询数据,速度最快。

    Processed: 0.014, SQL: 9