是否有更好的替代方案"列NOT IN(1,2,3)"?

时间:2016-09-15 07:01:08

标签: mysql sql

看到NOT IN和NOT EXISTS之间存在一些主要的性能差异,

出于兴趣,想知道是否可以优化此查询?

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

1 个答案:

答案 0 :(得分:2)

假设comment_id是表comments的主键,我不认为这可以改进。我也不明白你为什么要尝试。您的条件在主键上,因此查询应使用索引。

MySQL将其所有数据放在"背后"主键。或者,正如the documentation所说:

  

每个InnoDB表都有一个特殊的索引,称为聚簇索引,其中存储了行的数据。通常,聚簇索引与主键同义。

     

(...)

     
      
  • 如果没有为表定义PRIMARY KEY,MySQL会找到第一个UNIQUE索引,其中所有键列都是NOT NULL,而InnoDB将它用作聚簇索引。
  •   

因此,如果您的查询使用主键,那么以最快的方式来检索您的数据。

解释计划说了什么?

为什么你觉得有必要尝试进行优化?

NOT INNOT EXISTS之间的效果差异仅在使用子选择" fill" 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;