2017-06-19 51 views
1

我正在研究涉及單詞及其翻譯的項目。一個查詢翻譯必須頻繁任務(每10秒一次左右)的是:SQL使用LEFT JOIN優化「IS NULL」查詢

SELECT * FROM pwords p 
LEFT JOIN words w ON p.id = w.wordid 
WHERE w.code IS NULL 
OR (w.code <> "USER1" AND w.code <> "USER2") 
ORDER BY rand() LIMIT 10 

要接收一個字翻譯,該用戶尚未翻譯。在這種情況下,我們想禁止USER2輸入的文字

pwords表大約有66k條目,單詞表大約有55k條目。

該查詢大約需要500秒才能完成,而如果我刪除了IS NULL,則查詢需要0.0245 ms。我的問題在於:有沒有一種方法來優化此查詢?我真的需要擠壓數字。

這種情況是:USER1不希望來自USER2的單詞表中的任何數據庫條目。它不需要來自同一個表的自己的數據庫條目。因此,我需要使用IS NULL或類似方法從除USER1和USER2以外的所有用戶(其他用戶或NULL條目)獲取條目。

tl; dr所以我的問題是:有沒有辦法讓這個查詢運行得更快? 「IS NULL」是否可優化?

任何和所有的幫助,非常感謝。

回答

0

你可以嘗試以過濾行使用子查詢(用WHERE語句)儘快:

SELECT * 
FROM pwords p 
LEFT JOIN 
    (SELECT * 
    FROM words w 
    WHERE (w.code <> "USER1" AND w.code <> "USER2")) subq 
ON p.id = subq.wordid 
WHERE w.code IS NULL 
ORDER BY rand() LIMIT 10 

另一個(也許更有效的選擇)用NOT EXISTS聲明:

SELECT * 
FROM pwords p 
WHERE NOT EXISTS 
    (SELECT * 
    FROM words w 
    WHERE p.id=w.wordid AND (w.code <> "USER1" AND w.code <> "USER2")) 
ORDER BY rand() LIMIT 10 
+1

得到的查詢降到0.1326左右。非常感謝你!如果可以的話,我會讓你滿意!也感謝你教我關於子查詢,作爲一個我以前從未遇到過的業餘愛好者。 – deFunc

+0

您仍然可以將其標記爲正確的答案:) 有關MySQL中子查詢的更多信息,請訪問:https://dev.mysql.com/doc/refman/5.7/en/subqueries.html – Dimgold