2016-09-15 31 views
0

看到NOT IN和NOT EXISTS之間的一些主要性能差異,有沒有更好的選擇「列NOT IN(1,2,3)」?

想知道,出於興趣,是否可以優化此查詢?

-- (ignore the SELECT *) 
SELECT * 
FROM `comments` 
WHERE comment_id NOT IN (65,64,63) 
ORDER BY `comment_id` DESC 
+0

注意他們的行爲,如果有NULL的參與完全不同。 – jarlh

回答

2

假設comment_id是表comments的主鍵,我不認爲這可以改進。我不明白你爲什麼想嘗試。您的條件位於主鍵上,因此查詢應使用索引。

MySQL將其所有數據放在主鍵「後面」。或者,如the documentation所示:

每個InnoDB表都有一個特殊索引,稱爲聚集索引,其中存儲行的數據。通常,聚集索引與主鍵是同義的。

(...)

  • 如果不定義你的表的主鍵,MySQL的定位,所有的鍵列NOT NULL第一UNIQUE索引和InnoDB使用它作爲聚集索引。

所以,如果您的查詢使用的主鍵,這是最快的方式檢索您的數據。


解釋計劃說什麼?

爲什麼你覺得有必要嘗試優化呢?


NOT INNOT EXISTS之間的性能差異使用子選擇「填充」 IN列表時,僅僅是。

比較

SELECT c.* 
FROM comments c 
WHERE c.author_id NOT IN (
    SELECT a.author_id 
    FROM authors a 
    WHERE a.first_name = 'Jay' 
); 

SELECT c.* 
FROM comments c 
WHERE NOT EXISTS (
    SELECT * 
    FROM authors a 
    WHERE c.author_id = a.author_id 
     AND a.first_name = 'Jay' 
); 

,但我會用

SELECT c.* 
FROM comments c 
LEFT JOIN authors a 
    ON (c.author_id = a.author_id AND a.first_name = 'Jay') 
WHERE a.author_id IS NULL; 
+0

謝謝!我只是想知道是否有更好的方法來做我正在做的事情。 :) – Jay

+0

@Jay,俗話說,布丁的證明就在吃東西。嘗試幾種不同的方式並對其進行比較。 – SQB

相關問題