MySQL Join子句与WHERE子句

时间:2010-11-12 00:35:06

标签: mysql query-optimization

以下两种方式完成条款的区别是什么?

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2 AND
    table2.member_id = 4
)

我将它们与基本查询和EXPLAIN EXTENDED进行了比较,但没有看到差异。我想知道这里是否有人发现了一个更复杂/处理密集的环境的差异。

SELECT * FROM table1 INNER JOIN table2 ON (
    table2.col1 = table1.col2
)
WHERE table2.member_id = 4

4 个答案:

答案 0 :(得分:27)

使用INNER连接时,这两种方法会产生相同的结果,并且应该生成相同的查询计划。

但是JOIN(描述两个表之间的关系)和WHERE子句(从结果集中删除行)之间存在语义差异。这种语义差异应该告诉你使用哪一个。虽然它对结果或性能没有影响,但选择正确的语法将有助于代码的其他读者更快地理解它。

请注意,如果使用外部联接而不是内部联接,则可以有所不同。例如,如果将INNER更改为LEFT并且连接条件失败,则在使用第一种方法时仍然会获得一行,但如果使用第二种方法则会过滤掉(因为NULL不等于4)。

答案 1 :(得分:4)

如果您正在尝试优化和了解您的数据,通过添加“STRAIGHT_JOIN”子句可以极大地提高性能。你有一个内连接...所以,只是为了确认,你只想要连接table1和table2的记录,但只有表2的成员ID =某个值..在这种情况下为4.

我会将查询更改为将表2作为select的主表,因为它有一个显式的“member_id”,可以通过索引来优化以限制行,然后加入表1,如

select STRAIGHT_JOIN
      t1.*
   from
      table2 t2,
      table1 t1
   where 
         t2.member_id = 4
      and t2.col1 = t1.col2

因此查询将仅对member_id = 4记录进行资格预审,然后在表1和2之间进行匹配。因此,如果表2有50,000条记录而表1有400,000条记录,则首先列出第一个列出的table2。限制ID = 4甚至更少,加入table1时甚至更少。

我知道有一个事实,直接连接工作,因为我已经多次实现它处理超过15个查找表的超过14个查找表的gov't数据,其中引擎感到困惑,试图在关键表上为我思考。其中一个问题是在挂起之前花了24个多小时...添加“STRAIGHT_JOIN”并优先考虑查询中“主”表的内容,在2小时内将其放到最终的正确结果集中。

答案 2 :(得分:0)

你所描述的情况并没有太大差别;在多个复杂连接的情况下,我的理解是第一个有点优先,因为它会在一定程度上降低复杂性;那说,这将是一个小的差异。总的来说,你不应该注意到大多数情况(即使不是所有情况)。

答案 3 :(得分:0)

使用内连接,它几乎没有区别;如果你切换到外部加入,世界上的所有差异。

*我说“差不多”,因为优化者是古怪的野兽,在某些情况下,它可能会更好地优化前者或后者。 尝试利用此行为。