2015-02-09 62 views
0

我有一個查詢:爲什麼在查詢中使用IN(或NOT IN)子句使得它很慢

SELECT DISTINCT field1 FROM table1 WHERE field2 = something 

(表1中包含100萬條記錄,執行時間:0.106sec,返回20條記錄)

另一個查詢

SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse 

(表2中含有半萬條記錄,執行時間:0.078sec,回報率:20條)

現在,如果我運行一個查詢,通過上述兩種組合:

SELECT DISTINCT field1 FROM table1 WHERE field2 = something AND field1 NOT IN (SELECT DISTINCT similarField1 FROM table2 WHERE similarField2 = somethingElse) 

但這並沒有給出結果,即使運行了10分鐘。爲什麼它變得非常緩慢,什麼可能是一個潛在的解決方案。

編輯:我使用的是MySQL與DBVisualizer中6.5

+1

這是什麼,MySql或MS SQL服務器? – 2015-02-09 10:13:03

+0

MySQL,對不起刪除sql-server標籤 – 2015-02-09 10:14:31

+1

因爲MySQL很慢。你可以試着'LEFT JOIN'這兩個選擇,只返回那些沒有匹配的行。 (leftjoinedquery.field1爲空)。 – GolezTrol 2015-02-09 10:15:57

回答

1

你並不需要在子查詢中使用DISTINCT。嘗試使用NOT EXISTS這可能是在SQL-Server的更多高效:

SELECT DISTINCT field1 
FROM table1 
WHERE field2 = @something 
AND NOT EXISTS 
(
    SELECT 1 FROM table2 
    WHERE table2.similarfield1 = table1.field2 
    AND table2.similarfield2 = @somethingelse 
) 

編輯:既然你已經更新了標籤,我不知道這是否是在MySQL更有效。不過,我更喜歡NOT EXISTS,因爲它也works with NULL values(如果你使用IS NULL),並且更容易閱讀和維護。

0

我的查詢和建議類似於@TimSchmelter。

事實上,你不應該使用截然不同的。首先,你應該刪除不同的,並檢查你是否得到重複的記錄,你只是問你的問題的一部分。表設計不清楚。

你應該在這裏發佈完整的問題和查詢,沒有任何猶豫。另外不要忘記在feild2,feild1,similarField1,similarField2上應用索引。

SELECT DISTINCT field1 
FROM table1 tbl1 
WHERE field2 = something 
    AND NOT EXISTS (
     SELECT similarField1 
     FROM table2 tbl2 
     WHERE tbl1.field1 = tbl2.similarField1 
      AND similarField2 = somethingElse 
     ) 
+0

謝謝。表格設計很簡單,沒有別的要提到......我猜。嘗試過你的解決方案,但沒有幫助,它在10分鐘後仍然運行。我猜左外連接可能會有所幫助。 – 2015-02-09 11:24:48