【问题标题】:How to store large currency like data in database如何在数据库中存储类似货币的大数据
【发布时间】:2019-04-11 20:56:47
【问题描述】:

我的数据在很多方面都与货币相似,所以我将使用它来演示。

我有 10-15 组不同的数据,我们可以说不同的货币,例如美元或欧元。

他们需要有这些列:

timestamp INT PRIMARY KEY
value INT

它们中的每一个都将有超过 10 亿行,随着时间的推移,我会追加新的行。

我将在某些间隔内选择它们并创建图表。可能在同一张图中有多种货币。

问题是我应该添加一个组列并将所有列存储在一个表中还是单独保留。如果它们在同一列中,时间戳将不再是唯一的,可能我应该使用高级 SQL 技术来提高效率。

【问题讨论】:

  • 您能否详细说明“如果它们在同一列中,时间戳将不会是唯一的”是什么意思以及如果时间戳不是唯一的问题是什么?
  • 会有多行具有相同的时间戳。在同一个时间戳中,会有超过 1 行使用不同的货币。

标签: sql postgresql database-design


【解决方案1】:

10 - 15 种“货币”? 10 亿行每个?考虑 Postgres 11 或更高版本中的 list partitioning。这样,时间戳列在每个分区中保持唯一。 (虽然我不确定为什么这是必要的。)

或者只是有 10 到 15 个单独的表,而不是每行冗余地存储“货币”。这么多行的大小很重要。

或者,如果您通常对同一个时间戳有多个值(每个“货币”一个),您可以使用一个包含 10-15 个专用“货币”列的表。总体上要小得多,因为它节省了每个“货币”的元组开销(每行 28 个字节或更多)。见:

多个“货币”的单行实用性取决于详细规格。例如:对于单个值的许多更新可能效果不佳。

你添加了:

我已经阅读了以物理顺序在磁盘中对数据进行排序的聚集索引。我不会在表格中间插入新行

这似乎是BRIN indexes 的完美用例,它比它们的 B-tree 亲戚小得多。通常会慢一点,但使用您的设置可能会更快。相关:

【讨论】:

  • 唯一性不是必需的,但如果每个时间戳有超过 1 行,则索引等可能效率不高。
  • 我做了一些测试,列表分区非常适合我的情况。为分区添加“类型”列会使表大小增加 17%,但时间戳上的索引保持不变,即 3000 万行的 50%。 (1333 到 1571 MB 的表大小,加上 676 MB 的索引大小)但是我已经阅读了聚集索引,它在磁盘中按物理顺序对数据进行排序。我不会在表中间插入新行,那么是否可以使用聚集索引来摆脱索引开销?
  • Postgres 没有“聚集索引”,但有 BRIN 索引。我在上面添加了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多