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;
我的理解是第一次查询将更快,因为它减少了第一被接合,而第二查询并联接然后执行其中的行的数量。或者两者之间没有真正的区别?
编辑:正如我指出,我犯了一个错误,我的第一个查询,现在修复。
这两个查询是等价的。没有区别。
当你有你要比较两个有效的查询,您可以运行在每一个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子句中)。
感谢您的详细分类。我遇到了这篇文章以帮助解释EXPLAIN命令。 https://www.sitepoint.com/using-explain-to-write-better-mysql-queries/ 您有任何其他资源可能有助于了解有关此主题的更多信息吗? – Peck3277
EXPLAIN的真正威力在于理解MySQL优化器可以执行的操作,以及SQL构造影响或禁止这些操作。 http://dev.mysql.com/doc/refman/5.7/en/select-optimization.html – spencer7593
是什么EXPLAIN说什么?更好的是,SHOW WARNINGS的EXPLAIN EXTENDED followeg是什么意思;说?? – Strawberry
第一个应该是语法错误,你的意思是...... ON(table_a.status = table_b.status AND table_b.type = a)'? – mata
@mata:在那里修好了,你是对的。 – Peck3277