Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL连接子句vs WHERE子句_Mysql_Query Optimization - Fatal编程技术网

MySQL连接子句vs WHERE子句

MySQL连接子句vs WHERE子句,mysql,query-optimization,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.c

用以下两种方法做一个子句有什么区别

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

你所描述的情况其实没有多大区别;在有多个复杂联接的情况下,我的理解是第一个联接在某种程度上是优先的,因为它将在某种程度上降低复杂性;也就是说,这将是一个小的区别。总的来说,您不应该注意到在大多数情况下(如果不是所有情况的话)有太大的差异。

对于内部连接,这两种方法会给出相同的结果,并且应该生成相同的查询计划

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


请注意,如果使用外部联接而不是内部联接,则可能存在差异。例如,如果将INNER改为LEFT,并且连接条件失败,那么如果使用第一个方法,仍然会得到一行,但是如果使用第二个方法,它将被过滤掉(因为NULL不等于4)。

对于内部连接,几乎没有什么区别;如果你切换到外部连接,世界上所有的差异都会消失


*我之所以说“几乎”,是因为优化器是古怪的野兽,在某些情况下,它可能会更好地优化前者或后者。不要试图利用这种行为。

如果您试图优化并了解您的数据,添加“STRAIGHT_JOIN”子句可以极大地提高性能。你有一个内在的连接。。。所以,为了确认,您只需要table1和table2连接的记录,但只需要table2成员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
因此,查询将只预先限定成员_id=4条记录,然后在表1和表2之间进行匹配。因此,如果表2有50000条记录,而表1有400000条记录,那么首先列出表2将首先处理。限制ID=4甚至更小,并且在加入表1时更小


事实上,我知道straight_join是有效的,因为我已经多次使用它来处理政府的1400多万条记录数据,这些记录链接到15个以上的查找表,引擎在尝试为我思考关键表时感到困惑。其中一个问题是在绞刑前24个多小时。。。添加“直接连接”并对查询中的“主要”表进行优先级排序,在不到2小时的时间内将其删除为最终正确的结果集。

回答得很好,我自己也说得再好不过了+1-1:如果使用ANSI-89语法,则没有语义差异。此外,在ANSI-92中,如果外部联接的条件在WHERE和ON子句中,这会产生很大的差异——不仅仅是左。哦,点击post按钮太快了。在我看来,在ON()子句中包含与联接表相关的WHERE条件更有意义。我将继续讨论这个。。。看起来很有趣。我认为它有很大的潜力来提高性能,谢谢!