直截了当,我已经尝试搜索谷歌和SO,但无法找到我正在寻找的东西。可能是因为没有正确地搜索我的搜索。
我的问题是, 我有几张桌子,每年可容纳1,000到100,000。我想知道,我/我应该如何处理数据存档?我对数据库没有很好的经验,但下面是我提出的一些方法,我不确定哪种方法更好。当然考虑到性能和编码的简易性。我正在使用Java 1.8,Sql2o和Postgres。
方法1每年将数据存档到单独的数据库中。 我真的不喜欢这种方法,因为当我们想要搜索旧数据时,我们的应用程序需要搜索到不同的数据库,为我添加更多代码将是一件麻烦事。
方法2将数据存档到单独的数据库中,以存储超过2 - 3年的数据。 并使用线上的状态来提高性能。 (参见方法3)这是我倾向于作为“最优”解决方案的地方,其中代码不是那么复杂,而是由DB保持相对干净。
方法3只需拥有每一行的状态(例如:A =活动,R =已存档),以便可能提高查询的性能。只需要一个“select * from table where status ='A'”来减少要查看的行数。
每年100,000行并不是那么多。 [1]
没有必要将它移到一个单独的地方。如果您已经拥有良好的索引,那么多年来您几乎肯定不会注意到任何性能下降。
但是,如果您想要绝对确定,可以添加year
列并为其创建索引(或将其添加到现有索引)。但实际上,只对那些你知道自己需要它的桌子这样做。例如,如果您的表已经有一个date
列,它是索引的一部分,则不需要单独的year
列。
[1]除非你有数千个包含大量二进制blob的列和/或列 - 这似乎不是这里的情况。
正如Vog所提到的,100,000行并不是很多。您的餐桌可能会增加1,000,000或5,000,000个尺寸。
在许多数据库中,您可以使用聚簇索引,其中第一个键是“活动”列。但是,Postgres并不真正支持聚簇索引。
相反,我建议你看看table partitioning。这是一种方法,其中底层存储在不同的“文件”之间分配。您可以使用where
子句中的分区键轻松指定查询读取一个或多个分区。
对于您的特定用例,我建议仅针对活动数据查看数据。这只会读取一个分区,因此性能应该与只读取最新数据的表几乎相同。
也就是说,我不确定用active
旗帜或year
进行分区是否更好。这取决于您访问数据的方式,尤其是旧数据。