目录
本文概览:介绍了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、 执行命令
1 |
explain sql |
执行结果的内容如下如,重点在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中,用子查询作为一个字段
1 |
select id,(select xx from t2 where t1.id = t2.t1_id) name from t1; |
(2)包含在where条件中
如in或者exsit操作
4. derived,表示子查询的一种类型
当一个sql存在子查询时,在from的列表中包含的子查询被标记成derived。如
1 |
select id from (select id,name from t1) ts; |
2.3 table
涉及到的表名
2.4 type
查询类型,效率由高到底如下:
1. const,通过主键访问
2. eq_ref,通过唯一索引扫描
3. ref,通过普通索引扫描,返回匹配某个单值所有行,如下,col1是普通索引字段。
1 |
select * from t1 where col1 = 'abc' |
4. rang,相对于ref而言,返回一个索引字段满足的一个范围,如下
1 |
select * from t1 where id between 30 and 60 |
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”.
(全文完)