是否将WHERE条件放在WHERE或Join子句中,与连接无关?

时间:2014-08-01 19:42:50

标签: mysql join optimization query-optimization

例如:

SELECT * 
FROM a 
JOIN b ON a.b_id = b.id 
  AND b.col = 'something'

VS

SELECT * 
FROM a 
JOIN b ON a.b_id = b.id 
WHERE b.col = 'something'

我认为MySQL的查询优化器会认为这是相同的查询。在所有这些情况下它们是否相同,无论WHERE列是在表a还是表b?

1 个答案:

答案 0 :(得分:1)

这些查询将由MySQL以相同的方式处理。您可以通过在任一查询前放置EXPLAIN EXTENDED并查看查询执行计划来验证这一点。如果您需要一个很好的资源来理解EXPLAIN查询的输出,请查看http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/(如果该链接中断,请在网上搜索"了解MySQL解释"并且您将拥有没有找到资源的麻烦。

一般情况下,我会推荐你​​使用的第二种形式。与查询执行相关的技术原因不在于它,因为它与稍后修改代码的容易性有关,何时/如果需要。例如,假设您添加了四个或五个以上的连接。如果WHERE子句遍布整个地方,则很难读取此查询。

保持你的加入条款和你的WHERE过滤器是绝对的,我认为这是最好的做法,但它与易于阅读/编辑有关,而不是因为你最终会得到一个不同的查询执行计划(除非你犯了一个错误,我认为大多数人会更倾向于使用第一个查询而不是第二个查询)