2013-05-31 87 views
0

我在這裏提出了一個查詢,它在檢索不匹配連接的結果方面做了一些特殊的事情(正如這個SO問題所建議的那樣)。MySQL查詢超時 - 需要加快速度

SELECT cf.f_id 
FROM comments_following AS cf 
INNER JOIN comments AS c ON cf.c_id = c.id 
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE f_id = cf.f_id 
) 

有關如何加快速度的任何想法?它可以查看30k-200k行,並且似乎在使用索引,但查詢超時。

EXPLAIN/DESCRIBE信息:

1 PRIMARY c ALL PRIMARY NULL NULL NULL 39119 
1 PRIMARY cf ref c_id, c_id_2 c_id 8 ...c.id 11 Using where; Using index 
2 DEPENDENT SUBQUERY following index NULL PRIMARY 8 NULL 35612 Using where; Using index 
+1

添加關鍵字「DESCRIBE」在它的前面從數據庫中獲得一個分析它自己,併發布結果讓我們爲你解釋 –

+0

[執行計劃](http://dev.mysql。 com/doc/refman/5.5/en/execution-plan-information.html)必須說你的查詢? – phadaphunk

+0

更新w /查詢信息。 – stwhite

回答

1

comments表未在查詢中顯式使用。它被用於過濾嗎?如果沒有,請嘗試:

SELECT cf.f_id 
FROM comments_following cf 
WHERE NOT EXISTS (
    SELECT 1 FROM follows WHERE follows.f_id = cf.f_id 
) 

順便說一句,如果這生成語法錯誤(因爲follows.f_id不存在),那麼這就是問題所在。在這種情況下,你會認爲你有一個相關的子查詢,但並不是真的。

還是left outer join版本:

SELECT cf.f_id 
FROM comments_following cf left outer join 
    follows f 
    on f.f_id = cf.f_id 
where f.f_id is null 

有上follows(f_id)指數應該讓這兩個版本的運行速度。

1

LEFT JOIN有時快則WHERE NOT EXISTS subquerys,嘗試:

SELECT cf.f_id 
FROM comments_following AS cf 
INNER JOIN comments AS c ON cf.c_id = c.id 
LEFT JOIN follows AS f ON f.f_id = cf.f_id 
WHERE f.f_id IS NULL 
+0

剛剛嘗試過,但查詢仍然超時(需要一分鐘)...我更新了原始問題w/query解釋信息。 – stwhite

0

這個問題的答案是在follows.f_id上放置第二個索引。