MySQL设计:一种查询,用于获取在给定时间范围内具有大多数操作的集合

时间:2017-11-06 20:50:35

标签: mysql database-design

我有一个名为topic的表,其中有一个名为like_count的列。

是否可以在该表上写一个查询,询问“过去7天内给出我最喜欢的十大主题”,这意味着过去7天内对他们最喜欢的10个主题,没有创建一个额外的审计表?

我正在考虑通过创建一些审核表来实现这一目标,例如topic_like_audit只有两列:topic_idcreated_at。每当具有该ID的主题被喜欢时,新记录将存储在审计表中。然后,我可以编写一个查询,使用created_at列聚合过去7天内的所有结果,并按照该时间范围内记录数量最多的结果进行排名。

但是我无法想象这是一个可扩展的解决方案......它可能在短期内起作用,但当你的主题有数百万甚至数十万的喜欢时,这肯定是坏事。

做这样的事情的任何好的,标准的解决方案,还是我的方法足够?附:我是DB noob。

2 个答案:

答案 0 :(得分:1)

这取决于你是否可以容忍你的插入有点慢。

您可以做的是,最初您可以通过某些查询生成前十个主题的数据。 你可以在mysql或任何缓存层中维护这个列表。如果你维持在缓存级别会很好,因为你希望你的检索速度很快。

在新主题的每次插入时,您可以将当前主题与列表中的最小主题进行比较,如果当前较大,则可以交换它们。您可以使用优先级队列作为此事物的数据结构,从而导致O(logn)时间。

此过程可以进一步延迟,因为您最终可以拥有一致的系统而不是一致的系统。您可以将其推送到队列中,这可以由工作人员进一步处理。

答案 1 :(得分:1)

听起来你不能告诉他们什么时候喜欢""发生了?与每个"喜欢" (或者批次"喜欢")到日期时间(或者只是一天),你不能这样做。

当"喜欢"发生时,将其存储在包含TodaysLikestopic的表格datetime)中。在每天结束时,将昨天的数据汇总到包含LikesSummarytopic(非日期时间)和date的摘要表(count)中。然后将其从TodaysLikes中删除。

然后这将获得前10名:

SELECT topic, SUM(count) AS likes
    FROM LikesSummary
    WHERE date >= CURDATE() - INTERVAL 7 DAY
    ORDER BY likes DESC
    LIMIT 10

进一步的优化不是直接将like_count作为"喜欢"发生,但作为夜间摘要的一部分。 (这意味着like_count不是最新的,但只计算在昨晚。