数据库:聚合与存储预先计算的数据以在大型数据存储中查找?

database: aggregation vs storing pre computed data for lookup in large data store?

我们有一个包含 200 万条记录的 table 并且以每分钟 30 条记录的速度插入新行。

table结构是: |投诉|手机 |请求日期时间| .我们收到投诉、用户的手机和当前日期,我们将其保存在此 table 中。在这个 table.

中,我们可以有多行具有相同的手机

如果我们在过去 30 天内收到来自同一 "Mobile" 的请求少于 12 个,我们只需要保存新记录。我们在此处使用三种方法来计算特定手机的记录数:

  1. 每次插入新记录之前,首先在数据库中运行聚合查询以检查我们是否已经有12条记录具有该编号。如果是,请不要插入新的。这里的问题是查询的性能。
  2. 或在一天结束后存储此数据,即在过去 29 天内在 table 和 运行 中具有相同手机号码的行仅在当天聚合并添加两者以检查其是否更少比 12.

或者有人可以为此提出更好的解决方案吗?

另一个更好的方法是:

1) 在每次 EOD 时,维护一份移动负面清单 table(投诉数量 > 12)。

2) 如果记录是该列表的一部分,您将永远不会处理它。甚至您可以将这些记录缓存在内存中(取决于您使用的技术)并避免一起调用数据库。

3) 或者,您可以安排一个批次(比如每小时一次),这可以使用其他项目和缓存更新否定列表。

根据评论编辑

4) 如果在否定列表table中没有找到记录,请继续您的正常计数逻辑。

5) 您可以扩展 LRU(最近最少使用)缓存策略以在内存中对频繁记录进行计数,以避免进行数据库调用。确保在主数据库中插入 12 条记录后立即将一条记录刷新到否定列表中。

我将论证即时检查...

这是查询,对吗?

SELECT COUNT(*)
    FROM tbl
    WHERE num = 1234
      AND datetime >= NOW() - INTERVAL 30 DAY; 
  • 您每秒少于 INSERT
  • 查询不应return超过 12,对吗?
  • 使用 INDEX(num, date)SELECT 非常 快。
  • 现在你是 60 queries/minute(1/秒)。 (一个 SELECT +(通常)一个 INSERT)事情直到超过 100/秒才变得冒险。
  • BTree 索引非常有效,并且不受 table 大小的影响。因此,2M 行不是一个因素。 20亿也不会。
  • 我建议此解决方案比其他选择更简单。吻.

(我是汇总表的大力支持者,但我不能在这里证明它的合理性。)