2011-10-25 50 views
3

你能否告诉我这两句话哪一句更快?mysql - “INNER JOIN”或“IN”。哪个更快?

第一句:

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(...),因为我可以传递值或表格选择。

+0

我已经将SELECT t1。*的结果更改为SELECT DISTINCT(t1.user_id)以避免不同的结果。因为它通常是我真正关心的 – Seeker

回答

1

它们看起来都很像我的眼睛。我敢肯定,一个SELECT将提供更好的性能,因为MySQL的is not particularly good with subqueries

SELECT t1.* 
FROM table_users t1 
INNER JOIN table_towns t2 ON t1.user_town = t2.town 

在任何情况下,你应该看什么EXPLAIN plan对查询有说和实时数据进行一些基准测试。

0

你应该测量它,并发布解释计划以确保。但我不会使用那些:

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

IN正在为MySQL查杀。而是使用EXISTS

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

如果使用内部连接,不要将它作为子查询,因为MySQL不能很好地处理它们。只需加入table_towns表本身。

+0

对于最新的MySQL版本,这不再是真实的。 'IN(select ....)'已被优化。 – Johan

+0

也许不会再杀了,但比起来还是慢得多。 – GolezTrol

+0

@Johan - 这个有效的版本是什么?是否有兴趣听到(**来自实际测试,不仅仅是你认为是真的!**)是否存在'='和'IN'之间的巨大差异[http://stackoverflow.com/问题/ 3416076/this-select-query-takes-180-seconds-to-finish/3417098#3417098)已修复。马克·拜尔的回答我链接到那里的评论说这不是固定的,直到版本6.0 –

0

对你的问题没有确切的答案。这实际上取决于表上的索引是什么,以及您使用的DBMS是否可以使用它们。我有ININNER JOIN相比减少执行时间的情况,以及INNER JOIN更快的情况。

传闻为例(使用SQL Server,虽然):

我使用的是常见的领域加入一个临时表,常规表。当我查看执行计划时,执行计划显示了两个表之间的HASH JOIN。执行时间约为2秒。我用subselectINNER JOIN更改为IN,HASH JOIN消失,执行时间减少到1秒。它现在使用主表上的索引。

0

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

+0

你是对的。为了避免不同的结果,我只提出了一个字段的区别。 – Seeker

+0

在这种情况下,我相信第二个(使用JOIN)可能会更糟糕(如果优化器不够智能移动,则对子查询执行DISTINCT – a1ex07