看到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
看到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
假設comment_id
是表comments
的主鍵,我不認爲這可以改進。我不明白你爲什麼想嘗試。您的條件位於主鍵上,因此查詢應使用索引。
MySQL將其所有數據放在主鍵「後面」。或者,如the documentation所示:
每個InnoDB表都有一個特殊索引,稱爲聚集索引,其中存儲行的數據。通常,聚集索引與主鍵是同義的。
(...)
- 如果不定義你的表的主鍵,MySQL的定位,所有的鍵列NOT NULL第一UNIQUE索引和InnoDB使用它作爲聚集索引。
所以,如果您的查詢使用的主鍵,這是最快的方式檢索您的數據。
解釋計劃說什麼?
爲什麼你覺得有必要嘗試優化呢?
NOT IN
和NOT 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;
注意他們的行爲,如果有NULL的參與完全不同。 – jarlh