【问题标题】:MySQL Join: Conditions in WHERE or in ON (2)MySQL Join:WHERE 或 ON 中的条件(二)
【发布时间】:2014-04-14 04:04:49
【问题描述】:

我想知道将JOIN 的条件放在ON () 子句中是否比在后者WHERE 中更好维护。

例子:

Select * from persons p
  INNER JOIN x on (x.id = p.id AND x.other = p.other)

Select * from persons p
  INNER JOIN x on (x.id = p.id)
WHERE x.other = p.other

这里看起来不错,但是有多个 JOIN,我认为它更难:

Select * from persons p
  INNER JOIN x on (x.id = p.id)
  INNER JOIN x2 on (x2.id = p.id)
  INNER JOIN x3 on (x3.id = p.id)
WHERE x.other = p.other AND x2.other = p.other2 AND x3.other = p.other3

Select * from persons p
  INNER JOIN x on (x.id = p.id AND x.other = p.other)
  INNER JOIN x2 on (x2.id = p.id AND x2.other = p.other2)
  INNER JOIN x3 on (x3.id = p.id AND x3.other = p.other3)

我对正在开发的应用程序进行了测试,切换条件会产生相同的执行计划,我想我不知道我是否遗漏了什么,或者我是否可以在某些情况下发现性能影响。

谢谢

编辑:它与被标记为重复的问题不同。我不问 JOIN 和 WHERE 之间的区别。我问在使用 JOIN 语句时将条件放在 WHERE 和不在 ON 子句中的区别。

正如我在上一个问题的评论中所说,第二个 JOIN 处理已经过滤的数据不应该比 WHERE 稍后处理所有数据更快吗?

【问题讨论】:

  • 您在第二个查询中从哪里获得 p2 和 p3 别名?
  • 您应该始终使用 ANSI 语法 JOIN,因为条件更明确且更易于维护。 ANSI JOIN 将条件与关系条件分开
  • 考虑连接位置的快速方法是,当您使用join 使用on() 时,您正在创建一个“临时表”,该表已经返回您所要求的配对结果它到。如果您在where 中使用join,则您要求获取整个表,然后在收到每条数据后进行过滤。在小型应用程序中,您不会看到性能下降,但如果您使用的是实时数据或成千上万的行,您会立即知道。
  • 您的上一个问题有几票需要重新打开等待,因为您是正确的,它被错误地关闭了关于连接语法的问题。
  • 除了易于维护和更具可读性(这本身应该就足够了)之外,主要区别在于应用条件的阶段。当您在 JOIN 条件 (ON/USING) 中应用条件时 - 该条件实际上是在构建组合结果集期间应用的。而在另一种情况下(WHERE 子句)- 仅在构造结果集后才应用条件...

标签: mysql sql join


【解决方案1】:

将条件放在连接上与将它们放在 where 子句中的区别在于每个查询中数据的形状。

假设您的 persons 表中有 1000 行,x 中有 800 行,x2 中有 600 行,x3 中有 500 行与您指定的 people.id JOIN 条件匹配。

在这个查询中:

Select * from persons p
  INNER JOIN x on (x.id = p.id)
  INNER JOIN x2 on (x2.id = p.id)
  INNER JOIN x3 on (x3.id = p.id)
WHERE x.other = p.other AND x2.other = p.other2 AND x3.other = p.other3

当您到达 WHERE 子句时,您正在根据您指定的条件评估 500 行。

而在此查询中:

Select * from persons p
  INNER JOIN x on (x.id = p.id AND x.other = p.other)
  INNER JOIN x2 on (x2.id = p.id AND x2.other = p2.other)
  INNER JOIN x3 on (x3.id = p.id AND x3.other = p3.other)

在最坏的情况下,您最终可能仍会评估 500 行(所有 x.other = p.other 条件评估为 TRUE),但很可能在到达最后一个时评估的行数会减少加入。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2018-03-15
    • 2020-04-05
    • 2012-01-26
    • 2015-06-23
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多