2011-03-15 86 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

相關問題