【问题标题】:Does it make sense to replace sub-queries by join?通过 join 替换子查询有意义吗?
【发布时间】:2011-05-30 00:47:13
【问题描述】:

例如我有一个这样的查询。

select col1 from t1 where col2>0 and col1 in (select col1 from t2 where col2>0)

据我了解,我可以用以下查询替换它:

select t1.col1 from t1
join (select col1 from t2 where col2>0) as t2
on t1.col1=t2.col1
where t1.col2>0

添加

在某些答案中,我在其他 inner join 中看到 join。两者都对吗?或者它们甚至是相同的?

【问题讨论】:

  • 我不了解 MySQL...但我很确定 JOIN 倾向于在 SQL Server 和 Oracle 中更快。
  • 您在此处的联接仍在使用子查询,因此无法更快地呈现它。
  • 就 JOIN 类型而言,根据记忆,我认为 JOIN 相当于 INNER JOIN 也可以看看这里wellho.net/mouth/…

标签: mysql optimization select join subquery


【解决方案1】:

这是你想要做的吗?

select col1 from t1 
inner join t2 ON t2.col1 = t1.col1
where t1.col2>0 and t2.col2>0

JOIN 绝对是去这里的方式

【讨论】:

    【解决方案2】:

    更好:

    select t1.col1
        from t1
            inner join t2
                on t1.col1 = t2.col1
        where t1.col2>0
            and t2.col2>0
    

    【讨论】:

      【解决方案3】:

      其实这就够了

      select t1.col1 
      from t1 join t2 On t2.col1 = t1.col1
      Where t1.col2 > 0
         and t2.col2 > 0
      

      至于哪个更快,唯一确定的方法是测试。但我会建议,除非性能是一个真正的用户体验问题,否则更重要的问题是长期可维护性,对此,SQL 的清晰性是主要因素。在我看来,子查询方法更清楚地表达了您正在实现的功能

      【讨论】:

        【解决方案4】:

        连接通常更快,但最好的决定方法是进行基准测试。

        【讨论】:

        • +1:唯一能解释2个相关原因的人!
        【解决方案5】:

        这样的事情怎么样:

        select t1.col1 from t1 join t2 On t2.col1 = t1.col1
        AND t1.col2 > 0

        【讨论】:

          【解决方案6】:

          遇到这样的问题,无论如何你都应该加入

          select t1.col1 
          from t1 join t2 On t1.col1 = t2.col1
          where t1.col2 > 0 and t2.col2 > 0
          

          “join”和“inner join”没有区别。 “inner”可以省略,因为它是默认值;只需指定“外部”及其类型。但是,如果你这样写,“join”也可以省略:

          select t1.col1 
          from t1, t2 
          where t1.col2 > 0 and t2.col2 > 0 
            and t1.col1 = t2.col1
          

          【讨论】:

          • outer 不必指定。外连接有几种类型,Left outerright outerfull outerleftrightfull 是必需的,但关键字 outer 和关键字 inner 一样,是可选的。第二种结构(“省略关键字 Join”)与 Ansi-Standard SQL-89 完全不同,不应使用。
          • 你是对的,我的意思是,你必须指定外部的类型,而不是外部这个词,在大多数 DBMS 中可以省略它。我不同意不应该使用第二个构造,因为仍然存在不支持第一个连接构造的 DBMS。据我所知,优化器从内部构造了两种类型的相同查询,只是应该使用第一种,因为它更清楚发生了什么
          【解决方案7】:

          什么是有意义的取决于您的编码标准。

          在优化查询本身之前,我会避免对子查询和连接进行基准测试(删除无关的连接、重复的 where 子句、过多的列检索),并且分析表明需要优化特定查询。

          即便如此,您最好还是将时间花在为 RDBMS 在执行期间定义好的索引上。

          【讨论】:

            【解决方案8】:

            在许多情况下,查询优化器会将您的子查询重写为连接。如果您的子查询是其中之一,那么重写将是浪费时间。但是,如何判断是否是这种情况,我不知道。如果您当前的查询有问题,EXPLAIN 命令可能会帮助您。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-03
              • 2011-11-30
              相关资源
              最近更新 更多