2011-03-15 57 views
7

问题: 有什么解决方案或技巧,你将不得不处理一个非常大(数TB)的数据库索引在强冗余高冗余?创建一个非常大的哈希数据库的提示

某种倒立的存储?

Postgres有什么可以做的吗?

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

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

细节:

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

  • 一些任意元数据(一些文本 字段)包括一些主键
  • 一个散列(128位散列,强MD5样)

记录的数量是我认为非常大的数量:几个10到100亿美元)。 行之间存在显着的散列冗余(超过40%的记录将其散列与至少另一个记录共享,一些散列存在于100K记录中)

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

这是一个分析类型的数据库,所以整体负载中等,大部分是读取,很少写入,大部分是批量写入。

当前的方法是使用Postgres,在主键和哈希列上的索引上使用索引。该表在批处理中加载关闭哈希上的索引。

所有的索引都是btrees。 哈希列上的索引正在变大,比表本身大或大。在120 GB的桌上,重新创建索引需要大约一天的时间。查询表现非常好。

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

这太大了。而且我认为哈希中的冗余是存储更少的机会。

还要注意,虽然这描述了问题,但还是有一些需要创建的表。

+0

现在128位散列并不是真正的加密等级。你有没有试过不使用索引,而是根据散列的前8位进行分区? – 2011-03-15 14:41:51

+0

@Tyler 128位MD5或截断的SHA1对我来说是不错的加密。至少它有很好的关键范围。我尝试不使用索引,查找性能很糟糕。你可以详细说明关键分区吗? – 2011-03-15 14:43:41

+0

因此,使用索引并占用磁盘空间。优化速度或空间,选择一个。 – 2011-03-15 14:45:47

回答

5

您可以创建一个仅包含id和Hash的表,以及包含索引,元数据和hashId的其他数据。这样做,您可以防止在表中写入相同的哈希高达100k次。

+0

有趣,简单。这确实很有意义! – 2011-03-15 14:50:31

+1

现在是否有一些比散列索引更好的索引? – 2011-03-15 15:05:40

+0

我玩这个方法,再加上在postgres中构建一个反向存储(又名key/value表,它的值是一个用指针更新扩展的元组数组,实际上是一个发布列表)......这些都提供了有趣的尺寸减小,是的创建/更新时间的速度真的变慢了:现在我真的错过了一个真正的专业倒置存储容器,例如zettair,sphinx或xapian。 – 2011-03-30 16:20:04

相关问题