首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

技术分享 | Semi-join Materialization 子查询优化策略

在之前一篇文章 MySQL 子查询优化 中我们介绍了子查询的一些优化策略,也简单介绍了 Semi-join 是怎么来的,今天继续介绍 Semi-join 的一些具体实现。...什么是 Semi-join 常规联接中,结果可能会出现重复值,而子查询可以获得无重复的结果。...Semi-join 实现策略 子查询可以是相关子查询,如果子查询满足以上条件,MySQL 会将其转换为 semijoin,并从以下的策略中基于成本进行选择其中一种: Duplicate Weedout...Semi-join Materialization Semi-join Materialization 策略就是把子查询结果物化成临时表,再用于 semijoin 的一种特殊的子查询实现,它实际上也可以分为两种策略...而在 MySQL 中,子查询有 group by 分组操作时所有的 Semi-join 策略都无法使用,即无法使用 Semi-join 优化,举例: select dept_name from departments

77110

Semi-join使用条件,派生表优化 (3)—mysql基于规则优化(四十六)

前面说了子查询里有no/any/all不能用limit,group by,order by等,他会被查询优化器优化掉,子查询可能会物化转成内连接semi-join查询,物化就是会吧子查询看做一个表,如果数据太大...tmp_table_size,则会在磁盘里创建b+树的临时表,如果比较小,则会创建内存里hash树的临时表,之后会物化表转连接,但如果直接转where 和on,则可能会出现子查询多条的情况,我们的真实需求并不需要多条,所以有了semi-join...子查询注意事项&semi-join(2)—mysql基于规则优化(四十五) Semi-join适用 不是所有的都适用内连接 SELECT ......不适用semi-join 外层的where条件有其他其他搜索条件与子查询用or连接 SELECT * FROM s1 WHERE key1 IN (SELECT common_field FROM

62620
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL千万大表优化实践

如果读者了解mysql的in子查询原理的话就很好理解了,mysql会将in查询改写为semi-join关联查询,explain涉及到的start temporary和end temporary用于semi-join...步骤一:避免semi-join 如果笔者希望以tb_article作为驱动表,那么一定要避免in的关联子查询,因为mysql在执行in关联子查询的时候,会将其转化为semi-join,因为tb_category...避免semi-join的关键是避免in子查询,笔者将上述查询语句拆分为两个查询语句,在应用服务层首先执行如下语句选出经济,科技类型文章的编码 SELECT code FROM tb_category WHERE...我们看到,mysql以tb_article作为驱动表,并且查询不再涉及semi-join,达到了当前步骤的优化目的 步骤二:尽力使用索引 当前的查询语句以tb_article作为驱动表,同时使用了tb_article

1.9K31

技术分享 | EXPLAIN 执行计划详解(1)

也有例外,比如优化器对子查询做了 semi-join 优化时,和关联查询一样两个查询的 id 是一样的: mysql> explain select * from t1 where a in (select...SUBQUERY 当子查询不能被优化成 semi-join,但可以用 materialization 来优化,显示为 SUBQUERY,表示这是一个不相关子查询,子查询只需要执行一遍(因为结果被物化成临时表了...DEPENDENT SUBQUERY 当子查询不能被优化成 semi-join,并且是一个相关子查询(或者非相关子查询关闭 materialization 优化策略时),会被优化器转化成 exists...MATERIALIZED 当子查询被优化成 semi-join 执行,并且 semi-join 用的是 Materialize 策略,这个子查询对应显示就是 MATERIALIZED,然后用子查询结果物化后的临时表与另一张表进行关联查询...--------+----------------------------------------+ 7. unique_subquery 对一些包含 in 子查询的查询语句中,如果优化器无法使用 semi-join

2.5K10
领券