里面的JOIN ON子句在哪里?

时间:2016-11-17 15:18:21

标签: mysql

如果我有以下表格:

表-A

id   |   name  |tbl_b_key| status
-----+---------+---------+--------
0    |    a    |    1    |    0
1    |    b    |    2    |    0
2    |    c    |    3    |    1

表-B

id   |  type   | status
-----+---------+---------
0    |    a    |    0
1    |    b    |    0
2    |    b    |    1
3    |    a    |    1

这两个查询之间在性能方面有什么不同吗?

SELECT table_a.name, table_b.type FROM table_a JOIN table_b ON (table_a.status = table_b.status AND table_b.type = a);

SELECT table_a.name, table_b.type FROM table_a JOIN table_b ON (table_a.status = table_b.status) WHERE table_b.type = a;

我的理解是第一个查询会更快,因为它首先减少了连接的行数,而第二个查询执行连接然后执行where。或两者之间没有真正的区别?

编辑:正如我所指出的那样,我在第一次查询中犯了一个错误,现在修复了。

1 个答案:

答案 0 :(得分:2)

这两个查询是等价的。没有区别。

当您想要比较两个有效查询时,可以在每个查询上运行EXPLAIN以查看MySQL将使用的执行计划。

您可以执行每个查询来衡量效果。 (多次运行每个查询,绕过MySQL查询缓存,测量每次执行所用的时间,并丢弃第一次执行的时间。)

一般来说,MySQL会忽略多余的parens。谓词是谓词是谓词。它是在WHERE子句中还是在INNER JOIN条件的ON子句中无关紧要。 MySQL认为它是相同的

MySQL认为所有这些形式都是等价的:

  ... a JOIN b  ON   a.foo = b.foo   AND  b.bar = '1'  WHERE ...

  ... a JOIN b  ON  (a.foo = b.foo   AND  b.bar = '1') WHERE ...

  ... a JOIN b  ON   a.foo = b.foo  WHERE b.bar = '1'   AND  ...

  ... a JOIN b  ON  (a.foo = b.foo) WHERE b.bar = '1'   AND  ...

  ... a JOIN b WHERE a.foo = b.foo   AND  b.bar = '1'   AND  ...

我们可以对所有这些不同的表单运行EXPLAIN,我们会看到确切的相同的执行计划。我们预计性能不会有任何差异。

(使用外部连接,ON子句和WHERE子句中的谓词之间存在差异。)