簡體   English   中英

DynamoDB 全球二級索引“批量”檢索

[英]DynamoDB Global Secondary Index "Batch" Retrieval

我看過有關此的舊帖子,但希望再次提出這個話題。 我在 DynamoDB 中有一個表,它有一個 UUID 作為主鍵,我為一個對業務更友好的鍵創建了一個輔助全局索引 (SGI)。 例如:

| account_id  | email           | first_name | last_name |
|------------ |---------------- |----------- |---------- |
| 4f9cb231... | linda@gmail.com | Linda      | James     |
| a0302e59... | bruce@gmail.com | Bruce      | Thomas    |
| 3e0c1dde... | harry@gmail.com | Harry      | Styles    |

如果 account_id 是我的主鍵而 email 是我的 SGI,我如何查詢表以在 ('linda@gmail.com', 'harry@gmail.com') 中獲取 email 的帳戶 我查看了 IN 條件表達式,但它似乎不適用於 SGI。 我正在使用 go SDK v2 庫,但會接受任何指導。 謝謝。

簡短的回答,你不能。

DDB 旨在通過GetItem()返回單個項目,或通過Query()返回一組相關項目。 相關意味着您正在使用復合主鍵(散列鍵和排序鍵)並且相關項都具有相同的 hash 鍵(又名分區鍵)。

另一種思考方式,您不能Query() DDB 表/索引。 您只能Query()表或索引中的特定分區。

Scan()是唯一一次跨分區工作的操作。 但是掃描是非常低效和昂貴的,因為它每次都讀取整個表。

您需要為每個要返回的 email 發出一個GetItem()

幸運的是,DDB 現在提供BatchGetItem() ,允許您在一次調用中發送多個(最多 100 個) GetItem()請求。 節省一點網絡時間並自動並行運行請求; 但除此之外與您的應用程序可以直接使用GetItem()自行執行的操作略有不同。 別搞錯了, BatchGetItem()正在幕后發出單獨的GetItem()請求。 事實上, BatchGetItem()中的請求甚至不必針對相同的表/索引。 批次中每個請求的成本與直接使用GetItem()的成本相同。

需要注意的一個區別是, BatchGetItem()只能返回 16MB 的數據。 因此,如果您的 DDB 項目很大,您可能無法獲得所請求的那么多返回。

例如,如果您要求檢索 100 個項目,但每個項目的大小為 300 KB,系統將返回 52 個項目(以免超過 16 MB 的限制)。 它還會返回一個適當的 UnprocessedKeys 值,以便您可以獲得下一頁結果。 如果需要,您的應用程序可以包含自己的邏輯以將結果頁面組裝到一個數據集中。

因為您有一個 PK 為 email 的 GSI(據我了解),您可以使用 PartiQL 命令取回您的一批電子郵件。 API 稱為 ExecuteStatment,您使用類似 SQL 的語法:

SELECT * FROM mytable.myindex WHERE email IN ['email@email.com','email1@email.com']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM