【问题标题】:SQL: Shuold I use INNER JOIN conditions as a WHERE conditions?SQL:我应该使用 INNER JOIN 条件作为 WHERE 条件吗?
【发布时间】:2014-03-01 22:45:57
【问题描述】:

我应该使用 INNER JOIN 条件作为 WHERE 条件吗? 考虑以下两个示例查询来解释问题:

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON t1.id = t2.foreign_key 
WHERE t1.year < 2014

这没有WHERE 子句

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON  t1.id = t2.foreign_key 
        AND t1.year < 2014

由于 JOIN 类型为 INNER,因此两个查询都将产生典型结果集。

在性能方面哪个更好?

【问题讨论】:

标签: mysql sql inner-join where-clause


【解决方案1】:

通常性能应该相似,因为两个查询应该以相同的方式执行(如果查询优化器很好的话)。

我通常使用 WHERE 子句,因为有简单的连接条件确保将使用索引扫描(如果有适当的索引)。

例如,如果您的查询稍有变化(请参阅条件顺序):

SELECT t1.*, t2.* 
FROM table1 AS t1 
INNER JOIN table2 AS t2 
    ON t1.year < 2014
        AND t1.id = t2.foreign_key 

一些优化器引擎可能决定不在 t2.foreign_key 列上使用索引。

【讨论】:

  • 有趣。假设 t2.foreign_key 上有一个索引,而 t1.year 上没有索引,那么引擎可以有效地翻转这两个条件的顺序,利用索引来限制结果,并且只对另一个进行结果集扫描(年份)条件,而不是表扫描。
【解决方案2】:

尝试检查您的查询计划,应该几乎相同。 另外,db引擎可以优化查询到更好的执行计划,所以应该没有区别

【讨论】:

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