mysql - “INNER JOIN”或“IN”。哪个更快?

时间:2011-10-25 16:31:50

标签: mysql

你可以告诉我这两句话中哪一句更快?

第一句:

SELECT DISTINCT(t1.user_id) FROM table_users as t1 WHERE t1.user_town IN (SELECT t2.town FROM table_towns as t2)

第二句:

SELECT DISTINCT(t1.user_id) FROM table_users as t1 
  INNER JOIN (SELECT t2.town FROM table_towns as t2) as t3 ON t1.user_town = t3.town

我使用的选择通常有点复杂。 在可能的情况下,我尝试使用IN(...),因为我可以传递值或表选择。

5 个答案:

答案 0 :(得分:1)

它们看起来与我的眼睛非常相似。鉴于MySQL is not particularly good with subqueries

,我非常确定单个SELECT将提供更好的性能
SELECT t1.*
FROM table_users t1 
INNER JOIN table_towns t2 ON t1.user_town = t2.town

在任何情况下,您都应该看到查询的EXPLAIN plan必须说明什么,并对实时数据执行一些基准测试。

答案 1 :(得分:0)

您应该对其进行衡量,并发布解释计划以确定。但我不会使用这些:

select u.* from table_users as u
inner join table_towns as t on u.user_town = t.town

答案 2 :(得分:0)

IN正在杀死MySQL。而是使用EXISTS

INNER JOIN可以非常快,但结果不一定相同。您可能需要分组或distinct以获得相同(或类似)的结果,但在这种情况下我认为您是安全的。

如果使用内连接,请不要将其设为子选择,因为MySQL也不能很好地处理这些连接。只需加入table_towns表本身即可。

答案 3 :(得分:0)

你的问题没有明确的答案。这实际上取决于表上的索引以及您使用的DBMS是否可以使用它们。与ININNER JOIN更快的实例相比,我有INNER JOIN缩短执行时间的实例。

轶事示例(尽管使用SQL Server):

我使用公共字段将临时表加入常规表。当我查看执行计划时,执行计划在两个表之间显示了HASH JOIN。执行时间为2秒aprox。我使用INNER JOININ更改为subselect,HASH JOIN消失,执行时间缩短为1秒aprox。它现在使用主表上的索引。

答案 4 :(得分:0)

您发布的2个查询可能会产生不同的结果(第二个使用JOIN可以返回比第一个更多的行),所以我认为比较性能不正确。