Mysql 如何获取表中最常用的行?
我有一个几乎有200万行注释的表。我们每天收到大约500条新评论。每个评论都分配给一个特定的ID。我想根据特定的ID抓取最流行的“讨论” 我在ID列上有一个索引 什么是最佳实践?我是否只是按此ID分组,然后按评论最多的ID排序?这对这么大的桌子最有效吗 我是否只是按此ID分组,然后按评论最多的ID排序 我会这么做的。假设您想要检索前50名: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 如果用户在应用程
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链接到另一个表,您是正确的。而且,我也需要它