我有一张表评论差不多有200万行。我们每天收到大约500条新评论。每条评论都分配给一个特定的ID。我想根据具体ID获取最受欢迎的“讨论”。
我在ID列上有一个索引。
什么是最佳做法?我是否只按此ID分组,然后按评论最多的ID排序?对于这么大的桌子,这是最有效的吗?
答案 0 :(得分:4)
我是否只按此ID分组,然后按评论最多的ID排序?
这就是我如何做到这一点。我们假设您想要检索前50名:
SELECT id
FROM comments
GROUP BY id
ORDER BY COUNT(1) DESC
LIMIT 50
如果您的用户在您的应用程序中经常执行此查询,而您发现它的运行速度并不如您所希望的那么快,那么您可以优化它的一种方法是将上述查询的结果存储在单独的表(topdiscussions
),并且可能有一个脚本或cron,每隔五分钟左右间歇运行一次,这将更新该表。
然后在您的应用中,让您的用户从topdiscussions
表中进行选择,这样他们只需要选择 50 行而不是 200万。
这当然的缺点是选择将不再是实时的,而是不同步最多五分钟或者通常你想要更新表。实际需要它的实时程度取决于系统的要求。
编辑:根据您对此答案的评论,我对您的架构和要求有了更多了解。以下查询检索过去一天内最活跃的讨论:
SELECT a.id, etc...
FROM discussions a
INNER JOIN comments b ON
a.id = b.discussion_id AND
b.date_posted > NOW() - INTERVAL 1 DAY
GROUP BY a.id
ORDER BY COUNT(1) DESC
LIMIT 50
我不知道你的字段名称,但这是一般的想法。
答案 1 :(得分:0)
如果我理解您的问题,则ID会指出附加评论的讨论。所以,首先你需要一些最受欢迎的概念 1)通过按ID计算注释并将名为“delta”的列设置为0来初始化“注释总计”表。
2)定期
2.1)按ID
计算评论2.2)从新计数中减去旧计数,并将值存储到delta列中。
2.3)用新计数替换评论数。
3)选择10个最热门的讨论,从评论总数中选择10行,按降序排列。
现在其余的都是微不足道的。这只是其讨论ID与您在步骤3中找到的评论相匹配的评论。