JOIN ON子句里面的位置?

问题描述:

如果我有以下表格:JOIN ON子句里面的位置?

表-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; 

我的理解是第一次查询将更快,因为它减少了第一被接合,而第二查询并联接然后执行其中的行的数量。或者两者之间没有真正的区别?

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

+2

是什么EXPLAIN说什么?更好的是,SHOW WARNINGS的EXPLAIN EXTENDED followeg是什么意思;说?? – Strawberry

+1

第一个应该是语法错误,你的意思是...... ON(table_a.status = table_b.status AND table_b.type = a)'? – mata

+0

@mata:在那里修好了,你是对的。 – Peck3277

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


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

而且您可以执行每个查询来衡量性能。 (运行每个查询多次,绕过MySQL查询缓存,测量每个执行经过的时间,并扔出去的时候第一次执行)。


在一般情况下,MySQL将忽略多余的括号。谓词是谓词是谓语。无论它是在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子句中)。

+0

感谢您的详细分类。我遇到了这篇文章以帮助解释EXPLAIN命令。 https://www.sitepoint.com/using-explain-to-write-better-mysql-queries/ 您有任何其他资源可能有助于了解有关此主题的更多信息吗? – Peck3277

+0

EXPLAIN的真正威力在于理解MySQL优化器可以执行的操作,以及SQL构造影响或禁止这些操作。 http://dev.mysql.com/doc/refman/5.7/en/select-optimization.html – spencer7593