问题:您需要什么解决方案或技巧来处理一个非常大(数 TB)的数据库,该数据库以高冗余的强哈希为索引?
某种倒置存储?
Postgres有什么可以做的吗?
如果需要,我准备推出自己的存储空间。
(提示:必须是开源的,没有Java,必须在Linux上运行,必须是基于磁盘的,C/C++/Python优先)
细节:
我需要创建一个非常大的数据库,其中每条记录都有:
- 一些任意元数据(一些文本字段),包括一些主键
- 一个哈希(128 位哈希,类似 MD5 的强)
记录的数量是我认为相当大的:几十到上百亿)。跨行的散列存在显着冗余(超过 40% 的记录的散列至少与另一条记录共享,一些散列存在于 100K 记录中)
主要用途是通过哈希查找,然后检索元数据。次要用途是通过主键查找,然后检索元数据。
这是一个分析型数据库,因此整体负载中等,主要是读取,很少写入,主要是批量写入。
当前的方法是使用 Postgres,在主键上有一个索引,在哈希列上有一个索引。该表是在关闭散列索引的情况下批量加载的。
所有索引都是 btree。哈希列上的索引越来越大,与表本身一样大或更大。在一个 120 GB 的表上,重新创建索引大约需要一天时间。虽然查询性能相当不错。
问题在于,根据测试,目标数据库的预计大小将超过 4TB,其中 400GB 的较小数据集约占总目标的 10%。一旦加载到 Postgres 中,不幸的是超过 50% 的存储被散列列上的 SQL 索引使用。
这太大了。而且我觉得散列中的冗余是一个减少存储的机会。
另请注意,虽然这描述了问题,但需要创建其中一些表。