更好的查询获得用户每月排名?

时间:2014-12-13 11:04:26

标签: mysql sql

我有两张桌子:
user_score_post - > fields:id,post_id,user_id,score_date - >行距约3米 发布 - > field:id,user_id,body - >大约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秒。尽管使用适当的索引和强大的专用服务器,这是正常的吗?
这个查询的最佳替代方案是什么?什么是最好的索引组合?

2 个答案:

答案 0 :(得分: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)。这可能有所帮助。

答案 1 :(得分: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