选择查询非常慢,有时会挂起我的数据库

时间:2013-04-18 09:29:50

标签: mysql sql mysqli

我需要有关如何更快地进行此类查询的建议

SELECT count(distinct tweet_id) count 
FROM tweets 
WHERE tweet_id NOT IN 
     (
      SELECT distinct in_reply_to_status_id 
      FROM tweets_response 
      WHERE created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)) 
       AND created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR
     ) 

我在tweet_id和created_at上放置索引,但它仍然很慢

2 个答案:

答案 0 :(得分:3)

怀疑问题是索引(以及关于做解释的上述注释是100%正确的),但是不需要使用子选择。您的查询可以重写为: -

SELECT count(distinct tweet_id) `count` 
FROM tweets 
LEFT OUTER JOIN tweets_response 
ON tweets.tweet_id = tweets_response.in_reply_to_status_id AND tweets_response.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)
WHERE tweets_response.in_reply_to_status_id IS NULL
AND tweets.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)

答案 1 :(得分:0)

这应该更好。 子选择往往很慢。

SELECT count(distinct tweet_id)
FROM tweets twt
LEFT OUTER JOIN tweets_response tr
    ON twt.tweet_id = tr.in_reply_to_status_id 
WHERE tr.in_reply_to_status_id IS NULL and (tr.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)) 
   AND tr.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)