2011-10-25 51 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