【发布时间】:2019-08-14 03:48:01
【问题描述】:
我目前正在设计一个数据库表,其中我们将有几亿条记录,我想知道管理它的最佳方法是什么。使用这些类型的数据集,我们最终会遇到维护问题,例如表恢复或更改表需要很长时间。现在我对如何处理这个问题有了一些想法,但也许有更好的方法?
由于我们的数据越新越相关,我们可以将其拆分为较短的时间范围(例如过去 30 天)和旧数据集(比过去 30 天更早)。为此,我看到了两种可能性:
将其分成两个分区,当前分区和旧数据分区
优点:
- 当前数据分区的表还原会很快,因为它不是那么大。在紧急情况下,我们会先恢复它,然后仅使用该数据重新启动系统。这对用户来说是可接受的场景
- 我们可以正常读取/写入表 - 因此不需要特定的应用程序逻辑
缺点:
- 迁移脚本(更改表,我们可以在线使用,但如果我做对了,这并不适用于每个用例)需要很长时间,因为它们仍然针对两个分区运行。对此的解决方案是将旧数据分区为用户脱机并在后台运行。因此,用户在此期间将无法访问旧数据,但这没关系。这样的事情可能吗?
手动将其拆分为两个表并通过夜间作业移动数据。在上面我们放置一个视图来选择数据
优点:
- 我们可以通过不再将旧数据表包含在视图中并运行更改表脚本来使旧数据表脱机。完成后,将其放回视图中。由于用户不会再找到数据,他也将无法修改它
- 表恢复会很快,因为我们会首先恢复当前表,更新视图并让用户再次使用它。旧数据表的恢复需要一段时间,但没关系
缺点:
- 既然是视图,我们只能通过它进行选择。如果涉及到修改数据,我们需要为两个表编写更新查询,因为用户想要更新旧数据。因此,从应用程序的角度来看,它需要自定义逻辑
所以我的问题是,在这种情况下,最佳做法是什么?你会建议做什么?
谢谢
【问题讨论】:
-
您还可以使用更多分区按年和月进行子分区。我假设您将使用 InnoDB 引擎? InnoDB 引擎上的大多数 DDL 语句都可以在线运行,这意味着表或分区在更改时不会被锁定
-
你说的是一年插入 300M 行吗?仅 10 次/秒。直到每秒 100 次我才会兴奋。
标签: mysql database mariadb large-data database-partitioning