問題: 有什麼解決方案或技巧,你將不得不處理一個非常大(數TB)的數據庫索引在強冗餘高冗餘?創建一個非常大的哈希數據庫的提示
某種倒立的存儲?
Postgres有什麼可以做的嗎?
如果需要,我準備推出自己的存儲空間。
(提示:必須是開源的,沒有Java,必須在Linux上運行,必須是基於磁盤的,C/C++/Python的首選)
細節:
我需要建立一個非常大型數據庫,其中每個記錄都有:
- 一些任意元數據(一些文本 字段)包括一些主鍵
- 一個散列(128位散列,強MD5樣)
記錄的數量是我認爲非常大的數量:幾個10到100億美元)。 行之間存在顯着的散列冗餘(超過40%的記錄將其散列與至少另一個記錄共享,一些散列存在於100K記錄中)
主要用法是通過散列查找,然後檢索元數據。 次要用途是通過主鍵查找,然後檢索元數據。
這是一個分析類型的數據庫,所以整體負載中等,大部分是讀取,很少寫入,大部分是批量寫入。
當前的方法是使用Postgres,在主鍵和哈希列上的索引上使用索引。該表在批處理中加載關閉哈希上的索引。
所有的索引都是btrees。 哈希列上的索引正在變大,比表本身大或大。在120 GB的桌上,重新創建索引需要大約一天的時間。查詢表現非常好。
問題是目標數據庫的預計大小將超過4TB,基於400GB的較小數據集的測試,佔總目標的10%左右。一旦在Postgres中加載,不幸的是超過50%的存儲被哈希列上的SQL索引使用。
這太大了。而且我認爲哈希中的冗餘是存儲更少的機會。
還要注意,雖然這描述了問題,但還是有一些需要創建的表。
現在128位散列並不是真正的加密等級。你有沒有試過不使用索引,而是根據散列的前8位進行分區? – 2011-03-15 14:41:51
@Tyler 128位MD5或截斷的SHA1對我來說是不錯的加密。至少它有很好的關鍵範圍。我嘗試不使用索引,查找性能很糟糕。你可以詳細說明關鍵分區嗎? – 2011-03-15 14:43:41
因此,使用索引並佔用磁盤空間。優化速度或空間,選擇一個。 – 2011-03-15 14:45:47