2013-04-18 212 views
-1

誰能告訴我我該怎麼寫SQL語句:MySQL的LEFT OUTER JOIN加快查詢

SELECT url_source_wp.url 
FROM url_source_wp 
WHERE url_source_wp.id NOT IN (
    SELECT url_done_wp.url_source_wp 
    FROM url_done_wp 
    WHERE (url_done_wp.url_group = 4) AND (hash IS NULL)) LIMIT 50; 

使用加入?

我想:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp 
WHERE url_done_wp.url_group = 4 AND url_source_wp.hash is NULL LIMIT 50 

但答覆的內容是不一樣的。

問題是第一個SQL非常慢。

+0

慢查詢通常意味着缺乏(正確)的索引。在你的問題中添加'CREATE TABLE'語句,所以我們知道存在哪些索引。還有'EXPLAIN'輸出。你的第一個查詢看起來很好,寫得很好。 –

+0

的確......在WoLpH的回答中,null-join(「查找一行使得不存在任何可能的連接」)通常比在MySQL中的子查詢更好,但給了合理的索引(例如'url_group') (獨立的)子查詢結果並不是很荒謬,我不會指望它會很慢* – bobince

+0

子查詢可能導致數以百萬計的行。 – user2296949

回答

3

我相信你正在尋找的東西是這樣的:

SELECT url_source_wp.url 
FROM url_source_wp 
LEFT OUTER JOIN url_done_wp 
    ON url_source_wp.id = url_done_wp.url_source_wp AND url_done_wp.url_group = 4 AND hash IS NULL 
WHERE url_done_wp.url_source_wp IS NULL 
LIMIT 50 
0

你不應該只是否定兩個條件在WHERE子句中?

我假設你正在嘗試通過FK url_source_wp獲取所有url_source_wp記錄的id在url_done_wp表中引用,它們沒有url_group = 4,並且它們的哈希列不爲NULL,因爲您使用了NOT IN子查詢。 INNER JOIN應該沒問題。

所以它應該是:

SELECT url_source_wp.url 
FROM url_source_wp 
INNER JOIN url_done_wp ON url_source_wp.id = url_done_wp.url_source_wp 
WHERE url_done_wp.url_group != 4 AND url_source_wp.hash IS NOT NULL LIMIT 50 
+1

這不是一回事。原始查詢是「組4中沒有完成URL」的地方,這是「在其他組中沒有完成URL的地方」。 – bobince