入門閱讀時間 2 分鐘

DynamoDB 中的 GSI 與 LSI

Global Secondary Index(GSI)與 Local Secondary Index(LSI)都讓你能以一個並非表格鍵的屬性來 Query。它們並不能互換 — 兩者的差異決定了某個模式該選用哪一種。

重要的差異

GSILSI
Partition key任意屬性與表格相同
Sort key任意屬性任意屬性
建立時機隨時僅限建立表格時
一致性僅最終一致可強一致
容量自有共用表格的
寫入傳播非同步(最終一致)同步(原子)
每表格上限20(預設,可調高)5(硬限制)
10 GB partition 上限有(每個 PK)

經驗法則

  • 需要不同的 partition key(例如以 status 而非 customer 查詢訂單)?那你需要 GSI — LSI 無法重新分區。
  • 需要在同一個 partition 內有第二種排序順序 — LSI 會保留表格完全相同的 partition key,只換上不同的 sort key — 在一開始就決定好,並要求強一致讀取?那 LSI 適合。

抉擇歸結到一個問題 — 你要更改的是哪一個鍵:

YesNo, same PKnew sort keyNeed to queryanother way?Differentpartition key?GSILSIOwn partitionsEventual readsOwn capacityAdd anytimeShared partitionStrong reads OKShared capacityTable-creation only

不同的 partition key 強制要用 GSI;同一 partition 上換不同的 sort key,是唯一適合 LSI 的情況。

實務上大多數團隊幾乎只用 GSI:它們可在事後加上、可獨立擴展,且不受每分區 10 GB 限制的約束。讓單一 GSI 的鍵超載以服務多種模式 — 請參閱單一表格設計

如果你為了消除 Scan 而新增 GSI,請記得它有自己的讀取/寫入容量。用定價計算機估算這筆額外成本,並試用 DynoTable,在決定採用某個索引前先檢查它的投影屬性。

已更新