如果我有以下表格:
表-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。或两者之间没有真正的区别?
编辑:正如我所指出的那样,我在第一次查询中犯了一个错误,现在修复了。
答案 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子句中的谓词之间存在差异。)