Mysql:如果不是EXISTS则执行。是否有可能提高性能?

时间:2010-06-07 21:33:32

标签: mysql performance not-exists

我有两个表帖子评论。表评论包含 post_id 属性。我需要输入所有帖子,类型为“打开”,其中没有评论类型为“good”且创建日期为5月1日。

使用此类SQL查询是否最佳:

SELECT  posts.* FROM  posts  
WHERE NOT EXISTS (
SELECT comments.id FROM comments WHERE comments.post_id = posts.id 
AND  comments.comment_type = 'good' AND 
comments.created_at BETWEEN '2010-05-01 00:00:00' AND '2010-05-01 23:59:59')

在这种情况下,我不确定NOT EXISTS是否完美。

2 个答案:

答案 0 :(得分:5)

你是对的 - 你可以做得更好。有关详细信息,请参阅this article Quassnoi,但结论是:

  

这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULL或NOT IN而不是NOT EXISTS。

使用NOT IN重写的查询可能如下所示:

SELECT *
FROM posts  
WHERE posts.id NOT IN (SELECT post_id
                       FROM comments
                       WHERE comments.comment_type = 'good'
                       AND comments.created_at BETWEEN '2010-05-01 00:00:00'
                                                   AND '2010-05-01 23:59:59')

答案 1 :(得分:1)

不知道它是否更快,你可以检查一下:

SELECT * FROM posts
LEFT JOIN comments 
ON comment.postid = post.id
AND comment.comment_type='good'
WHERE comment.postid IS NULL

假设postid永远不是NULL /非NULLable列。