【问题标题】:Does it make a difference whether I put WHERE conditions in the WHERE or Join clause, unrelated to the join?我是否将 WHERE 条件放在 WHERE 或 Join 子句中,与连接无关?
【发布时间】:2014-09-25 02:09:14
【问题描述】:

例如:

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

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

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

【问题讨论】:

  • 作为一个好的经验法则,你应该在 JOIN 上加入事物并在 WHERE 上过滤事物。这样你可以更轻松地阅读它,并且以后可以更轻松地重构它
  • @JohnRuddell 但是它们的执行方式是否相同,从而使性能相同?
  • 是的,据我所知执行是相同的。我刚刚看到很多查询使用该逻辑或相反的逻辑。连接表并使用完成连接的位置。它还不错,但通常更难阅读。所有优秀的程序员都应该养成以某种方式做事的习惯。如果你想这样做,就试着一直保持这种方式。一致性是关键。我建议使用 where 来表示它的含义,而 join 来表示它的含义,但这是我个人的偏好

标签: mysql join optimization query-optimization


【解决方案1】:

这些查询将由 MySQL 以相同的方式处理。您可以通过将 EXPLAIN EXTENDED 放在任一查询前面并查看查询执行计划来验证这一点。如果您需要很好的资源来理解 EXPLAIN 查询的输出,请查看 http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/(如果该链接断开,请在网络上搜索“Understanding MySQL Explain”,您可以轻松找到资源。

一般来说,我会推荐您使用的第二种形式。这与其说是与查询执行相关的技术原因,不如说是与以后在需要时/如果需要时修改代码的容易程度有关。例如,假设您又添加了四个或五个连接。如果 WHERE 子句遍布各处,则很难阅读此查询。

将连接子句和 WHERE 过滤器分开绝对是我认为的最佳做法,但这与易于阅读/编辑有关,而不是因为您最终会得到不同的查询执行计划(除非您犯一个错误,我认为大多数人更有可能使用第一个查询而不是第二个查询)

【讨论】:

  • 我还要补充一点,我同意上面的@JohnRuddel ......这最终是一个偏好问题,更重要的是你要保持一致。话虽如此,如果您使用第二种方式而不是第一种方式,您将与更多的 SQL 开发人员保持一致。它只是更容易阅读和管理,至少在我的经验中(我想很多其他人也是如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2012-06-06
  • 2014-02-07
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多