7

问题:您需要什么解决方案或技巧来处理一个非常大(数 TB)的数据库,该数据库以高冗余的强哈希为索引?

某种倒置存储?

Postgres有什么可以做的吗?

如果需要,我准备推出自己的存储空间。

(提示:必须是开源的,没有Java,必须在Linux上运行,必须是基于磁盘的,C/C++/Python优先)

细节:

我需要创建一个非常大的数据库,其中每条记录都有:

  • 一些任意元数据(一些文本字段),包括一些主键
  • 一个哈希(128 位哈希,类似 MD5 的强)

记录的数量是我认为相当大的:几十到上百亿)。跨行的散列存在显着冗余(超过 40% 的记录的散列至少与另一条记录共享,一些散列存在于 100K 记录中)

主要用途是通过哈希查找,然后检索元数据。次要用途是通过主键查找,然后检索元数据。

这是一个分析型数据库,因此整体负载中等,主要是读取,很少写入,主要是批量写入。

当前的方法是使用 Postgres,在主键上有一个索引,在哈希列上有一个索引。该表是在关闭散列索引的情况下批量加载的。

所有索引都是 btree。哈希列上的索引越来越大,与表本身一样大或更大。在一个 120 GB 的表上,重新创建索引大约需要一天时间。虽然查询性能相当不错。

问题在于,根据测试,目标数据库的预计大小将超过 4TB,其中 400GB 的较小数据集约占总目标的 10%。一旦加载到 Postgres 中,不幸的是超过 50% 的存储被散列列上的 SQL 索引使用。

这太大了。而且我觉得散列中的冗余是一个减少存储的机会。

另请注意,虽然这描述了问题,但需要创建其中一些表。

4

1 回答 1

5

您可以创建一个只有 id 和 Hash 的表,并使用索引、元数据和 hashId 创建其他数据。这样做,您可以防止在表中写入最多 100k 次相同的哈希。

于 2011-03-15T14:45:41.813 回答