MySQL Join:WHERE或ON中的条件(2)

时间:2014-03-10 20:25:15

标签: mysql sql join

我想知道在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)

我正在测试我正在开发的应用程序并切换条件产生相同的执行计划,以为我不知道我是否遗漏了某些东西,或者我是否能在某些情况下发现性能影响。< / p>

由于

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

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

1 个答案:

答案 0 :(得分:0)

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

假设您的人员表中有1000行,x中有800行,x2中有600行,x3中有500行符合您指定的persons.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),但最有可能的是,当您到达最后一个时,您将最终评估较少的行数加入。