美文网首页
MySQL执行计划详解 - seletc_type 一些例子和说

MySQL执行计划详解 - seletc_type 一些例子和说

作者: 右耳菌 | 来源:发表于2022-09-26 23:32 被阅读0次

    一些例子

    -- select type的多种类型
    -- id相同的可以认为是一组,从上往下顺序执行;
    -- id不同id值越大,优先级越高,越先被执行。
    
    -- SIMPLE 最简单的查询方式
    EXPLAIN select * from myshop.ecs_users where user_id =1;
    
    -- 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;
    
    -- 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);
    
    -- SUBQUERY,子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集
    EXPLAIN select * from myshop.ecs_users where user_id = (
        select max(user_id) from myshop.ecs_users where email is null );
    
    -- 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';
    
    -- MATERIALIZED 物化子查询
    EXPLAIN select * from myshop.ecs_users 
        where user_id in (
            SELECT USER_ID FROM myshop.ecs_order_info where order_id < 10 );
    
    -- 从 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);
    
    -- 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);
    

    执行计划输出列说明:



    如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

    相关文章

      网友评论

          本文标题:MySQL执行计划详解 - seletc_type 一些例子和说

          本文链接:https://www.haomeiwen.com/subject/mvzxartx.html