我需要存储与计时器会话相关的数据。我的 MySQL 表如下所示:
user_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
timer_start_time TIMESTAMP
timer_end_time TIMESTAMP
有许多用户 (>10 000) 每天执行多次 (<10) 计时器会话。但是,我只需要存储最近的 5 个。所以每个用户只能有5条记录。如何设计一个符合这些要求并保持高性能的架构?
我正在考虑将 JSON 对象存储在 VARCHAR 中,但听说这是一个不好的做法。
我更愿意使用 MySQL,但考虑到性能提升,我会考虑切换到任何其他数据库。
计划 A:插入时不要强制执行“限制 5”。我们可能可以处理十亿行,而不会对性能或磁盘空间造成压力。
计划 B:当您为用户插入新计时器时,删除该用户的 6 个计时器中最旧的计时器(如果有 6 个计时器)。这将表大小限制为 50K 行——这是一个微不足道的表大小。
我认为你提到的“10”没有被强制执行?如果是,也许答案是存储 10 而不是 5。这允许强制执行这两个限制(以不同的方式)。
这可能足以删除给定用户的第六个最旧的“计时器”
用户可以有两个具有相同 end_time 的计时器吗?如果没有的话我推荐
这将使一些操作变得高效。
您可能还需要
处理您暗示的其他操作。
如果您完全确定 5x2 时间戳限制,那么您可以设置一个包含 user_id 和 5x2 时间戳列的宽表,user_id 在表中变得唯一,并且您可以在应用程序端更新整个行。这还允许您转向按用户索引的 NoSQL 方法。
然而,迁移这些数据应该非常简单,您可以使用简短的 SQL 视图生成上述模式(在停机期间具体化),因此我建议坚持使用通用表,并在遇到实际性能问题时进行迁移。此时,您将更好地了解性能关键用例/痛点,以便更好地进行测试和优化。谁知道呢,您可能会发现历史日志以意想不到的方式有用。