繁体   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