2014-12-13 38 views
0

我有两个表:
user_score_post - >字段:ID,POST_ID,USER_ID,score_date - >用3m左右行
后 - >字段:ID,USER_ID,身体 - >约10K的行...

,这是我的检索与专用USER_ID用户的每月排名查询和得分按照他的职位有喜欢的数量:更好的查询来获取用户每月排名?

SELECT COUNT(*) FROM 
    (SELECT COUNT(l.id) AS likes 
     FROM user_score_post l 
     JOIN post p ON p.id = l.post_id 
     AND score_date >= :time // last month 
     GROUP BY p.user_id) AS score 
    WHERE score.likes > :score // user current score 

,但它需要2.4秒执行。尽管使用合适的索引和强大的专用服务器,这是否正常?
此查询的最佳选择是什么?什么是最好的索引组合?

+0

是唯一的帖子?如果是这样,那么不知道为什么你在user_score_post中也有。这是多余的。不回答问题,但你的回答将有助于澄清你的问题 – 2014-12-13 11:21:22

回答

0

有时在MySQL中使用相关的子查询比使用聚合的联接更快。您可以试试:

SELECT COUNT(*) 
FROM (SELECT (SELECT COUNT(*) AS likes 
       FROM user_score_post l 
       WHERE p.id = l.post_id AND score_date >= :time 
      ) as likes 
     FROM post p 
    ) score 
WHERE score.likes > :score // user current score 

然后,你要索引user_score_post(post_id, score_date)。这可能有帮助。

+0

谢谢,但最后一行是不正确的。我们不能在这里使用score.likes!请仔细检查。 – 2014-12-13 15:23:03

+0

,因为你正在内部选择中定义喜欢。我测试了你的查询,它说有一个语法错误 – 2014-12-13 21:10:11

+0

@salehhashemi。 。 。我懂了。我迷惑了自己。 'as like'需要更进一步。 。 。或该列没有名称。 – 2014-12-13 21:29:56

0

它似乎下面返回每个用户的分数。也许score_date应该在月份开始和结束时使用。

select p.user_id, count(*) from user_post_score l 
join post p on (p.user_id=l.user_id) 
where score_date > :time 
group by p.user_id