MySQL系列-优化之explain的id、select_type、table

1.id介绍

这个id不是主键的意思,他是用来标识select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序。

会出现以下情况:

id相同:按从上到下顺序执行

id不同:id值越大,优先级越高,越先被执行

id相同不同的同时存在:优先执行id值大的,如果id值相同,则按从上到下的顺序执行

id为null表示是用来合并结果集的,在sql使用union关键字合并结果集就会出现他。

2.select_type介绍

顾名思义,表示查询的类型

类型 说明
simple 简单子查询,不包含子查询和union
primary 包含union或者子查询,最外层的部分标记为primary
subquery 一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived 派生表——该临时表是从子查询派生出来的,位于form中的子查询
union 位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived
union result 用来从匿名临时表里检索结果的select被标记为union result
dependent union 顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询
subquery 子查询中第一个SELECT语句
dependent subquery 和DEPENDENT UNION相对UNION一样

3.table介绍

对应行正在访问哪一个表,表名或者别名。也有可能是临时表等等,或者是union合并结果集。

  • 表名是derivedN的形式,表示使用了id为N的查询产生的衍生表
  • 当有union result的时候,表名是union n1,n2等的形式,n1,n2表示参与union的id

注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

4.举例说明


说明:可以看到,先查询b2表再查询b1表,而且都是简单查询。



说明:b2表对应的id为2,所以先查询b2表,查询类型是依赖子查询,然后在查询b1表,查询类型是主查询。



说明:先查询b2表,在查询b3表,然后查询b1表,最后合并结果集。<union1,2>指的是将id为1和id为2查询的结果合并。



说明:先查询b1表得出一个临时表,然后在查询这个临时表,这个derived2表示使用了id为2的查询出来的结果集作为临时表,最后才是b2表。


参考资料:

MySQL EXPLAIN详解

谷粒学院

猜你喜欢

转载自blog.csdn.net/UFO___/article/details/80951869