本文概览:介绍了explain的作用、使用和各个字段含义。

1 介绍

1、explain的作用

主要根据extra字段来查看是否出现了Using temorary或者using fileSort;通过key来查看是否用了索引。

(1)就是看下是否需要有添加索引的字段

  • 通过查看key字段

(2)join的驱动表是否恰当

  • 如果mysql优化不合理,为了给优化器一个暗示如何使用用户想要的联表顺序,即确定哪个表示驱动表,此时可以使用STRAIGHT_JOIN。因为mysqll有默认优化,将查询结果集较小作为驱动表,但是此时如果使用了order by 结果集较多的字段,那么此时即使我们写的sql语句中把大结果集的表作为驱动表,mysql优化仍然会将其作为被驱动表,此时就引入了Straight_Join。
  • 如何知道联表顺序?通过查看explain执行结果的顺序就可以知道联表顺序。
  • 如何分析联表顺序是否合理?查看extra字段来分析是否驱动表合适

(3)除了上述两个作用,其实还有一个额外作用,就是查看sql执行时间

2、 执行命令

执行结果的内容如下如,重点在type和extra两个部分。

id select_type table type possible_keys key key_len ref rows Extra

3、 对于一个查询的执行计划,有时结果有多个行,这是因为一个查询是一行记录,有多少个表联合,就有在执行计划结果中有多少条记录

4.  执行计划只有select,其他的update、insert和delete是没有执行计划的。

2 各字段含义

主要有extra(4种,用于查看是否出现了Using temorary或者using fileSort),key(用于查看是否用了索引)

2.1 id

表示select子句的执行顺序。id相同,执行顺序由上而下。

2.2 select_type

1. simple

表示查询中不包含子查询或者union。

2. primary

当一个sql存在子查询时,最外层的查询被标记成primary。

3. subquery,表示子查询一种类型

当一个sql存在子查询时,这个子查询是在select或where列表中的子查询,则子查询被标记成subquery,如:

(1)包含在select中,用子查询作为一个字段

(2)包含在where条件中

如in或者exsit操作

4. derived,表示子查询的一种类型

当一个sql存在子查询时,在from的列表中包含的子查询被标记成derived。如

2.3 table

涉及到的表名

2.4 type

查询类型,效率由高到底如下:

1. const,通过主键访问                           

2. eq_ref,通过唯一索引扫描

3. ref,通过普通索引扫描,返回匹配某个单值所有行,如下,col1是普通索引字段。

4. rang,相对于ref而言,返回一个索引字段满足的一个范围,如下

5. index,扫描整个索引表

6.all,全表扫描

2.5 possible_keys

possible_keys可能对应多个索引,但是在mysql中,一个表上查询语句只能用到一个索引。如果对于联合查询的sql语句,也是一个表对应一个索引,有n个表,最多使用n个索引。

2.6 key

在实际查询中这正使用到哪个索引,对于一个表,使用到的索引个数或者为0,或者为1。

2.7 key_len

对应key字段中索引对应的字段的长度。

2.8 ref

表示on后面的字段,联表查询时,连接的字段,

2.9 rows

估算执行计划中每一个查询找到匹配行所需要读取的行数。mysql默认进了优化,将rows较小的作为驱动表,如果想要修改这个顺序,此时就引入了Straight_join

2.10 Extra

1. Using index

表示相应的select语句中使用了覆盖索引.

2. Using where

如果查询未能使用索引,Using where只是提醒我们MySL将用where子句进行结果过滤.

3. Using temorary(嵌套查询的时候或者group或者被驱动表使用了order by)

表示MySQL将使用临时表来存储结果集,常见于分组和排序查询.

4. Using filesort

MySQL将无法使用索引进行排序的的操作称为”file sort”.

(全文完)

分类&标签

发表评论

电子邮件地址不会被公开。 必填项已用*标注