2

直截了当,我试过在谷歌和 SO 上搜索,但找不到我要找的东西。这可能是因为我的搜索措辞不正确。

我的问题是,
我有几张桌子,每年可以容纳 1,000 到 100,000 行。我想弄清楚,我/我应该如何处理归档数据?我对数据库的经验并不丰富,但下面是我想出的一些方法,我不确定哪种方法更好。当然要考虑性能和易于编码。我正在使用 Java 1.8、Sql2o 和 Postgres。

方法 1 每年将数据归档到单独的数据库中。
我不太喜欢这种方法,因为当我们想要搜索旧数据时,我们的应用程序将需要搜索不同的数据库,并且为此添加更多代码对我来说很麻烦。

方法 2 将 2-3 年以前的数据归档到单独的数据库中。
并使用在线状态来提高性能。(参见方法 3)这是我倾向于作为“最佳”解决方案的东西,其中代码不那么复杂,但也让 DB 保持相对干净。

方法 3 只需为每一行设置状态(例如:A=active,R=Archived)以可能提高查询的性能。 只需使用“select * from table where status = 'A'”来减少要查看的行数。

4

2 回答 2

1

每年 100,000 行并不多。[1]

无需将其移至单独的位置。如果您已经有了良好的索引,那么这些年来您几乎肯定不会注意到任何性能下降。

但是,如果您想绝对确定,您可以添加一year列并为其创建索引(或将其添加到现有索引中)。但实际上,仅对您知道需要它的表执行此操作。例如,如果您的表已经有一个date列是索引的一部分,则不需要单独的year列。

[1] 除非您有数千个列和/或包含大型二进制 blob 的列 - 这似乎不是这里的情况。

于 2018-06-17T08:57:46.817 回答
0

正如 Vog 所说,100,000 行并不是很多。也不是 1,000,000 或 5,000,000 - 您的表可能会增长到的大小。

在许多数据库中,您可以使用聚集索引,其中第一个键是“活动”列。但是,Postgres 并不真正支持聚集索引。

相反,我建议您查看表分区。这是一种将底层存储拆分为不同“文件”的方法。where您可以通过在子句中使用分区键轻松指定查询读取一个或多个分区。

对于您的特定用例,我会进一步建议仅查看活动数据的数据。这只会读取一个分区,因此性能应该与读取仅包含最新数据的表几乎相同。

也就是说,我不确定按active标志或按year. 这取决于您如何访问数据,尤其是旧数据。

于 2018-06-17T12:33:40.793 回答