我有一张包含近 200 万行评论的表格。我们每天收到大约 500 条新评论。每个评论都分配给一个特定的 ID。我想根据特定的ID抓取最流行的“讨论”。
我在 ID 列上有一个索引。
什么是最佳实践?我是否只是按此 ID 分组,然后按评论最多的 ID 排序?对于这种大小的桌子,这是最有效的吗?
我有一张包含近 200 万行评论的表格。我们每天收到大约 500 条新评论。每个评论都分配给一个特定的 ID。我想根据特定的ID抓取最流行的“讨论”。
我在 ID 列上有一个索引。
什么是最佳实践?我是否只是按此 ID 分组,然后按评论最多的 ID 排序?对于这种大小的桌子,这是最有效的吗?
我是否只是按此 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
我不知道您的字段名称,但这是一般的想法。
如果我理解您的问题,ID 表示附有评论的讨论。所以,首先你需要一些最流行的概念。
1) 通过按 ID 计算评论并将名为 'delta' 的列设置为 0 来初始化“评论总数”表。
2) 定期
2.1)按ID统计评论
2.2)从新计数中减去旧计数并将值存储到增量列中。
2.3) 用新的评论数替换评论数。
3) 通过从评论总数中按增量降序选择 10 行来选择 10 个“最热门”讨论。
现在其余的都是微不足道的。这只是讨论 ID 与您在第 3 步中找到的评论相匹配的评论。