Database-Design

在 RocksDB 中高效儲存大列表結構,以便在頁面中檢索數據

  • February 26, 2022

描述:

RocksDB 是一個鍵值儲存,因此我們可以簡單地序列化對象列表並儲存與鍵對應的值。如果列表中的數據足夠小,這將是可以的。

但是如果列表很大並且不斷增加,那麼我們需要對數據進行分頁。因此,在這種情況下,儲存與單個鍵對應的整個序列化列表數據不是一個好主意;因為每次將新數據插入列表時都會出現性能問題,因此在向使用者顯示列表時,在讀取期間也需要讀取和更新這個非常大的值使用者需要。

例如:假設我們想將使用者下的訂單儲存在 RocksDB 中。然後我們可以在 RockDB “u:1:li:o” 中以以下方式儲存這個訂單數據: Serialized(

$$ O1{}, O2{},….On{} $$)。但是,如果使用者下達了數千個訂單,我們希望以頁面的形式檢索訂單(一次 10 或 20 條記錄)。因此,將數千個訂單儲存在同一個鍵中並從該鍵中檢索整個數據,然後提供所需的 10-20 條記錄並不是一個好主意。此外,使用者向同一鍵添加新訂單也會影響上述性能。 所以我正在努力設計架構,以便在 RocksDB 中有效地儲存和檢索如此大的列表。

如果您可以就架構設計提出建議,那將非常有用。

您需要將“大列表”拆分為“Segment B-Tree”的一組節點,然後將每個節點儲存為 RocksDB 記錄。

每個節點都需要將它的高度儲存在“Segment B-Tree”中,並且它是左子 ID。

這有很多好處

  1. 這將使您無需掃描整個列表即可查找列表中是否有一個條目。
  2. 掃描所有葉節點會很快,因為葉節點具有連續的 ID
  3. 這使您可以使用偏移量輕鬆獲取列表的任何子集。

有關更多詳細資訊,請參見:https ://www.sqlite.org/fts3.html。

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