我有两张桌子:
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秒。尽管使用适当的索引和强大的专用服务器,这是正常的吗?
这个查询的最佳替代方案是什么?什么是最好的索引组合?
答案 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