Mysql 如何获取表中最常用的行?

Mysql 如何获取表中最常用的行?,mysql,Mysql,我有一个几乎有200万行注释的表。我们每天收到大约500条新评论。每个评论都分配给一个特定的ID。我想根据特定的ID抓取最流行的“讨论” 我在ID列上有一个索引 什么是最佳实践?我是否只是按此ID分组,然后按评论最多的ID排序?这对这么大的桌子最有效吗 我是否只是按此ID分组,然后按评论最多的ID排序 我会这么做的。假设您想要检索前50名: SELECT id FROM comments GROUP BY id ORDER BY COUNT(1) DESC LIMIT 50 如果用户在应用程

我有一个几乎有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分组,然后按评论最多的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中找到的讨论ID匹配的评论。

如果我理解您的问题,ID表示附加了评论的讨论。所以,首先你需要一些最受欢迎的概念。
1) 通过按ID计算注释数并将名为“delta”的列设置为0,初始化“注释总数”表

2) 周期性

2.1)按ID统计评论

2.2)从新计数中减去旧计数,并将值存储到增量列中

2.3)用新计数替换评论计数

3) 通过按增量递减顺序从评论总数中选择10行,选择10个“最热门”的讨论


现在剩下的都是琐碎的。这只是讨论ID与您在第3步中找到的讨论ID相匹配的评论。

什么是“最受欢迎的”?评论最多的十大讨论?前50名?您是否缩小了特定日期之后的讨论范围?最佳做法是保持简单并编写一个普通的SELECT查询,如下面Zane的回答。什么是“最受欢迎的”?评论最多的十大讨论?前50名?您是否缩小了特定日期之后的讨论范围?最佳做法是保持简单并编写一个正常的SELECT查询,如下面Zane的回答。您依赖于不合逻辑和非标准的行为。一个更好的数据库会给你一个类似的错误。更合适的解决方案是只选择讨论id和注释计数,然后通过联接获取讨论/注释。@DCoder,我这样写的两个原因是:1)我不知道OP的DB结构或他/她需要选择的列。可能
id
链接到另一个名为
discussions
的表,在这里您需要一个连接来获取有关讨论的信息/或者可能comments表是非规范化的,并且还包含讨论标题、用户id等。2)这被清楚地标记为MySQL,允许这样做。我只想根据提供的信息显示最简单的示例。是的,ID链接到另一个表,您是正确的。而且,我也需要它