【问题标题】:SQL "ON" Clause OptimizationSQL“ON”子句优化
【发布时间】:2009-02-07 18:15:04
【问题描述】:

哪个查询会运行得更快?

SELECT * FROM topic_info
    LEFT JOIN topic_data ON topic_info.id = topic_data.id
WHERE id = ?

SELECT * FROM topic_info
    LEFT JOIN topic_data ON topic_data.id = topic_info.id
WHERE id = ?

不同之处在于“ON”子句的表达式顺序:第一个查询是检查 topic_info.id 和 topic_data.id,第二个是 topic_data.id 和 topic_info。哪个查询通常会运行得更快?

(我知道任何一个查询都不会因为“id”列不明确而解析,但让我们忽略它)

【问题讨论】:

  • 为了可读性而缩进代码

标签: sql mysql optimization join


【解决方案1】:

我不认为它应该有所作为。选择一个约定并坚持下去。

【讨论】:

    【解决方案2】:

    可能无关紧要,但一定要测试一下。

    如果您使用 MySQL,请尝试“explain select ...”——它会告诉您您需要了解的内容。

    【讨论】:

      【解决方案3】:

      其他的贴子都是对的,不管你用哪种方式表达加入。

      这是因为他们的查询优化器将确定最有效的方法,当然还有查询计划用于您的查询。无论您的连接语句顺序如何,都会发生这种情况。

      希望这可以为您解决问题,但请随时索取更多详细信息。

      干杯,约翰

      【讨论】:

        【解决方案4】:

        现代 dbs 足够智能,因此它不会影响执行性能。

        【讨论】:

        • 我不认为“智能”和“现代数据库”与它有任何关系。更重要的是“a = b”和“b = a”在数学/逻辑上是等价的。
        • 哦,是的……确实如此。如果 a = 1M 记录和 b = 3M 记录,那么您如何评估联接确实很重要。早些时候,连接顺序在查询中确实很重要(您可以在执行计划更改中看到它)。现在没有了。
        【解决方案5】:

        他们返回的结果不会略有不同吗?

        因为它是一个左连接,如果其中一个表中的行没有在另一个表中链接记录,则当该表位于连接子句的右侧时,它们将不会被检索。

        还是我误会了?

        编辑:我完全误解了 - 刚刚做了一些测试。 Ta 感谢评论者让我直截了当。

        【讨论】:

        • 加入顺序没有改变。 FROM topic_info LEFT JOIN topic_dataFROM topic_data LEFT JOIN topic_info 返回不同的结果。
        • 对,OP 仅更改 ON 子句中的术语顺序。平等是可交换的,所以结果是一样的。唯一的区别可能在于 SQL 引擎选择索引的方式。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多