MySQL性能调优之explain参数详解

2022-08-09,,,,

参数列表

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

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

本文地址:https://blog.csdn.net/hello_v_world/article/details/107132876

《MySQL性能调优之explain参数详解.doc》

下载本文的Word格式文档,以方便收藏与打印。