如何抓住表中最受欢迎的行?

时间:2012-07-08 04:20:25

标签: mysql

我有一张表评论差不多有200万行。我们每天收到大约500条新评论。每条评论都分配给一个特定的ID。我想根据具体ID获取最受欢迎的“讨论”。

我在ID列上有一个索引。

什么是最佳做法?我是否只按此ID分组,然后按评论最多的ID排序?对于这么大的桌子,这是最有效的吗?

2 个答案:

答案 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中找到的评论相匹配的评论。