mysql select_type simple_Mysql执行计划-selectType

一、执行计划列输出说明

e810ba598afa5393e006540dab4998e4.png

二、select_type 查询的类型

4718644f810ac52300ae1f6db81039ba.png

1、simple

SIMPLE 最简单的查询方式

EXPLAIN select * from myshop.ecs_users where user_id =1;

输出

f5fc0f9f523c72fd6060905f45268132.png

2、PRIMARY

PRIMARY 最外层开始查询

UNION,UNION 第一个SELECT 为PRIMARY,第二个及之后的所有SELECT 为 UNION SELECT TYPE;

UNION RESULT,每个结果集的取出来后,会做合并操作,这个操作就是 UNION RESULT

EXPLAIN select * from myshop.ecs_users where user_id =1 union select * from myshop.ecs_users where user_id =2;

输出

8523a5270c10367e00a14268336e8ca9.png

根据 id 越大,优先级越大,也就是 id 为 2 的先查询,即 union 后半部分先执行。

id 为 2 的查询类型为UNION。根据上面说明,第一个SELECT 为PRIMARY,第二个及之后的所有SELECT 为 UNION SELECT TYPE;

然后 id 为 1 的再执行查询;

最后一行表示不查询,只是将两个结果集合并。

3、 DEPENDENT UNION

DEPENDENT UNION,子查询中的UNION操作,从UNION 第二个及之后的所有SELECT语句的SELECT TYPE为 DEPENDENT UNION

DEPENDENT SUBQUERY,子查询中内层的第一个SELECT,依赖于外部查询的结果集

EXPLAIN select * from myshop.ecs_users where user_id in (

select user_id from myshop.ecs_users where user_id =1 union select user_id from myshop.ecs_users where user_id =2);

输出

ab0f68adceb8293dcbbd6553e628a8ab.png

首先,查询的是括号里面的查询语句的union 后面那部分,也用到主键索引

第二个查询的是 id 为 2 的那个,也用到主键索引,即括号里面第一部分,union 前面那部分查询

到输出最后一行,显示将第二个查询和第三个查询合并;

最后执行 id 为 1 的查询, 可以看到,这条查询,并没有用到任何索引。

4、DERIVED

DERIVED 派生表,子查询在 FROM子句中

EXPLAIN select * from myshop.ecs_users a,

(select max(user_id) as user_id, CURRENT_DATE() from myshop.ecs_users where email is null ) b

where a.user_id = b.user_id;

-- mysql不会为每个子查询都创建派生表,派生表的目的就是用于保存子查询的中间结果

-- 此语句优化后无子查询(子查询展开) EXPLAIN select * from (select user_id from myshop.ecs_users where user_id =1) as a;

-- 默认开启,优化器工作 可以关闭 set optimizer_switch='derived_merge=off';

输出

b35e5297d4f6d7f21d6c9e923a315ed4.png

先查询,优先级最高的 id 为 2 的查询,生成一张临时表

然后,两个 select  id 为 1 的一样,就先从上到下,查询。

5、MATERIALIZED

MATERIALIZED 物化子查询

可以当作做成一个临时表,比如,下面 in 后面括号里面的查询

EXPLAIN select * from myshop.ecs_users

where user_id in (

SELECT USER_ID FROM myshop.ecs_order_info where order_id<10);

输出

a045b2114889d7aa6b31413bae525979.png

先执行,id为2, 查询 ecs_order_info 生成一张临时表

先执行,id 为 1 (上面的哪条)的那条查询,叫 , type 为 ALL, 全部查询出来

再执行最后一个 id 为1 的查询

6、UNCACHEABLE SUBQUERY

从 MySQL 5.7.20开始,查询缓存就被弃用了,并在 MySQL 8.0中被删除。

UNCACHEABLE SUBQUERY 结果集不能被缓存的子查询,不可物化每次都需要计算(动态计算,耗时操作)

EXPLAIN select * from myshop.ecs_users where user_id = (

select max(LAST_INSERT_ID()) as user_id from myshop.ecs_users);

输出

12ca5f4bc93e007e92a9d38fc0dc01c3.png

id = 2, 先得到一个不能被缓存的子查询

7、UNCACHEABLE UNION UNION

UNCACHEABLE UNION UNION中第二个语句或后面的语句属于不可缓存的子查询

EXPLAIN select * from myshop.ecs_users where user_id = (

select max(LAST_INSERT_ID()) as user_id from myshop.ecs_users

union select max(LAST_INSERT_ID()) as user_id from myshop.ecs_users);

输出

eee14bfadc75914589b5f01875509c33.png

----------------------------------

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值