Postgresql

在 Postgres 中使用機率過濾器(bloom 過濾器或 cuckoo 過濾器)過濾行

  • February 5, 2022

我有一個大表(~1B 行),btree在單列上有一個索引bytea(~20GB,但適合記憶體)。

我想從客戶端發送一個帶有機率過濾器(例如布隆過濾器或布穀鳥過濾器)的查詢,並讓數據庫掃描索引,收集所有可能與過濾器匹配的行。這應該返回所有可能的匹配項和一些誤報。目標是避免提供所請求項目的完整列表(出於隱私考慮 - 客戶端有一個列表,但不能與伺服器共享它)。

我看到 Postgres 有一個用於創建基於布隆過濾器的索引的bloom模組,但我認為它不能用於針對btree索引測試查詢中提供的布隆過濾器。

我想最終結果看起來像:

SELECT key, value FROM table WHERE matches_filter(key, b'01010101010101');

有什麼方法可以在這裡重用bloom模組中的內部方法嗎?或者是否有任何暴露機率過濾功能的擴展?

無論您擁有多少 RAM,您都無法擁有 20GB 的字節值。最大為 1GB。並且你不能在任何地方接近那麼大的 btree 索引值——但不清楚為什麼你指定 btree,因為你還談到了創建新的索引類型。

您可以做的是使用眾所周知的散列函式(如 md5 或 sha256)來消化客戶端上的完整值,然後將其截斷到您認為可能發生衝突的長度,然後將截斷後的值發送到伺服器搜尋。然後,伺服器可以發回所有匹配的全長摘要。(或者它可以發回完整長度的文件,但如果它們大於 1GB,則不會)。這樣你就可以知道你的文件(或者它的雜湊摘要)是否已經在數據庫中,但是數據庫不知道哪些(如果有的話)是你想要搜尋的。一個正常的 btree 索引就足夠了。

引用自:https://dba.stackexchange.com/questions/307025