MySql--Explain 详解(上)
2019-05-17 本文已影响0人
简书徐小耳
具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》
EXPLAIN
EXPLAIN语句输出形式
- 1.id:在一个大的查询语句中每个SELECT关键字都对应一个唯一的id
- 2.select_type: SELECT关键字对应的那个查询的类型
- 3.table:表名
- 4.partitions:匹配的分区信息
- 5.type:针对单表的访问方法
- 6.possible_keys:可能用到的索引
- 7.key: 实际上使用的索引
- 8.key_len:实际使用到的索引长度
- 9.ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息
- 10.rows:预估的需要读取的记录条数
- 11.filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
- 12.Extra:一些额外的信息
table
- 1.EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表的表名
id
- 1.对于包含UNION的语句,每一个select 就对应一个id
- 2.在连接查询的执行计划中,每个表都会对应一条记录,这些记录的id列的值是相同的,出现在前边的表表示驱动表,出现在后边的表表示被驱动表
- 3.一般包含子查询的id是不一样的
- 4.查询优化器可能对涉及子查询的查询语句进行重写,从而转换为连接查询。这时候id就一样了。
- 5.UNION会生成一个临时表,对结果进行去重。这个时候id为NULL
select_type
- 1.每一个SELECT关键字代表的小查询都定义了一个称之为select_type的属性
- 2.SIMPLE:查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型
- 3.PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
- 4.UNION:对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION
- 5.UNION RESULT:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT
- 6.SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询
- 7.DEPENDENT SUBQUERY: 如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY
- 8.DEPENDENT UNION:在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION
- 9.DERIVED:采用物化的方式执行的包含派生表的查询
- 10.MATERIALIZED:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询
- 11.UNCACHEABLE SUBQUERY
- 12.UNCACHEABLE UNION
- 13.select_type为DEPENDENT SUBQUERY的查询可能会被执行多次
type
- 1.代表访问一条记录的方法是什么样的
- 2.具体的访问方法以前写过 可以参考:
https://www.jianshu.com/p/2afee5496e61
possible_keys和key
- 1.前者列出查询时候可能用到的索引
- 2.后者代表实际的索引
- 3.使用index访问方法来查询某个表时,possible_keys列是空的,而key列展示的是实际使用到的索引
- 4.possible_keys列中的值并不是越多越好,可能使用的索引越多,查询优化器计算查询成本时就得花费更长时间,所以如果可以的话,尽量删除那些用不到的索引
- 5.key_len:索引的长度
ref
- 1.索引列等值匹配的条件去执行查询时,也就是在访问方法是const、eq_ref、ref、ref_or_null、unique_subquery
、index_subquery其中之一时,ref列展示的就是与索引列作等值匹配的东西(常数或者列或者函数)
rows
- 1.代表预计需要扫描的行数或者索引记录行数