2009-02-07 96 views
2

哪个查询会运行得更快?SQL“ON”子句优化

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_info第二topic_data.id。哪个查询通常会运行得更快?

(我知道,无论是查询将无法解析,因为模棱两可的“ID”列的,但让我们忽略)

+0

缩进可读性 – jandersson 2009-02-07 21:00:39

回答

4

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

2

现代dbs足够智能,因此它在执行性能上没有任何区别。

+0

我不认为“精明”和“现代的DB”有什么用它做的代码。更“a = b”和“b = a”在数学上/逻辑上是等价的。 – Tomalak 2009-02-07 20:08:59

+0

哦,是的......它的确如此。如果a = 1M记录和b = 3M记录,那么评估您的联接方式无关紧要。早些时候,连接的顺序在查询中很重要(你可以在执行计划改变中看到它)。现在它不。 – Learning 2009-02-08 02:52:29

3

可能并不重要,但要做测试。

如果您使用MySQL,请尝试'解释选择...' - 它会告诉您您需要知道什么。

2

他们不会返回稍微不同的结果吗?

因为它是一个左连接,所以如果任一表中的行没有另一个表中的链接记录,那么当该表位于连接子句的右侧时,将不会检索到它们。

还是我误解了?

编辑:我完全误解了 - 只是做了一些测试。 Ta给评论者让我笔直。

3

其他海报是正确的,无论你用什么方式表达连接。

这是因为他们查询优化器将确定最有效的方法,当然还有查询计划用于查询。无论您的联合声明的顺序如何,这都会发生。

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

干杯,约翰