MySql中的索引优化分析之性能分析中的explain介绍和基本使用

 一:在我们对sql语句进行性能分析时,发现mysql优化器我们没改,一些瓶颈问题没遇到,比如内存问题,IO问题也没出现。因此需要用explain来帮助我们分析

二:Explain是什么?

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的SQL语句的,分析你的查询语句或者是表结构的性能瓶颈。

三:如何用Explain?

1:比如这条SQL语句:select *from tbl_cmp;

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

2:使用expalain如下:explain  select *from tbl_cmp;

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

上面的输出结果的属性下面介绍。

所以格式就是:Explain+SQL语句

四:Explain能干什么(下面已经解释了)?

1:表的读取顺序             2:数据读取操作的操作类型               3:哪些索引可以使用

4:哪些索引被实际使用               5:表之间的引用              6:每场表有多少行被优化器查询

五:各字段解释:

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

1:id:

A:id相同时,执行顺序是由上至下的,比如:

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

B:id不同时:如果是子查询,id***会递增,id值越大优先级越高,越先被执行

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

C:id相同不同,同时存在


MySql中的索引优化分析之性能分析中的explain介绍和基本使用

所以Explain可以进行表的读取顺序

2:select_type

A:SIMPLE:简单的select 查询,查询中不包含子查询或者UNION

B:PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为

C:SUBQUERY:在SELECT或WHERE列表中包含了子查询

D:DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MYSQL会递归执行这些子查询,把结果放在临时表里

E:UNION:若第二个SELECT出现在UNION之后,则被标记为UNION,若UNION包含在FROM子句的子查询中,外层SELECT将被标记为DERIVED

F:UNION  RESULT:从UNION表获取结果的是SELECT

所以Explain可以查看数据读取操作的操作类型

3:type:访问类型排列

显示了查询使用了何种类型:从最好到最差依次是:system>const>eq_ref>range>index>ALL

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

4:possible_key

显示可能应用在这张表中的索引,一个或者多个

查询涉及到的字段上若存在索引,则改索引将被列出,但不一定被查询实际使用

5:key

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

查询中使用了覆盖索引,则改索引仅出现在key列表中

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

注意看possible_keys中,比如第一行中理论上索引用可能用到了PRIMARY和idx_t1,而在key中实际上用到的要看key里面的

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

6:key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好

key_len显示的值为索引字段的最大可能长度,并非实际使用使用的长度,即key_len是根据表定义计算而得,不是通过表内检索出的。比如:

MySql中的索引优化分析之性能分析中的explain介绍和基本使用

在这里可以看出第一个查询的key_len是13,第二个是26,长度不同是因为两个查询的精度不同,条件不同所以key_len不同。

7:ref:显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值

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

MySql中的索引优化分析之性能分析中的explain介绍和基本使用在用到了索引后,算出查询的行数是142

9:extra:

包含不适合在其他列中显示但十分重要的额外信息