欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL性能调优之explain参数详解

程序员文章站 2022-09-05 15:21:45
参数列表1.id1.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_type2.1 simple简单的se...

参数列表

MySQL性能调优之explain参数详解

1.id

1.1 id相同情况

MySQL性能调优之explain参数详解

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

1.2 id不同的情况

MySQL性能调优之explain参数详解

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

1.3 id相同又不同的情况

MySQL性能调优之explain参数详解

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

MySQL性能调优之explain参数详解

包含了以上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后面的字段刚好和建立索引的字段个数、顺序都能对应上,则使用索引,例:

MySQL性能调优之explain参数详解

7.key_len

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

8.ref

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

MySQL性能调优之explain参数详解

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

9.rows

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

MySQL性能调优之explain参数详解

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

10.Extra

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

10.1 using filesort 文件内排序

MySQL性能调优之explain参数详解

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

MySQL性能调优之explain参数详解

10.2 using temporary

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

MySQL性能调优之explain参数详解

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

MySQL性能调优之explain参数详解

10.3 using index

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

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