如何跨多个分片查询 DynamoDB 全局二级索引?

How to query a DynamoDB global secondary index across multiple shards?

本文(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-gsi-sharding.html)讨论了一种通过引入随机整数作为分区键来跨多个分区对全局二级索引值进行分片的技术。

这对我来说很有意义,但这篇文章没有清楚地解释如何查询该索引。假设我使用 1-10 中的随机整数作为分区键,使用一个数字作为排序键,我想获取排序键值最高的 3 条记录(来自所有分区)。

我是否需要执行 10 个单独的查询,对每个查询进行排序,最多 3 个项目,然后对生成的 30 个项目进行内存排序并选择前 3 个?这似乎不必要地复杂,而且对客户来说效率不高。

有什么方法可以执行单个 DynamoDB 操作来查询所有 10 个分区,进行排序,然后只 returns 具有最高值的 3 条记录?

Would I need to do 10 separate queries

是的。这在 Dynamo 文档中称为 scatter read...

通常客户端会使用多个线程来执行此操作...因此虽然它增加了复杂性,但效率通常很好。

为什么要限制 3 个?该要求似乎是效率低下的更大原因。

Is there some way to do a single DynamoDB operation that queries all 10 partitions, does the sorting, and just returns the 3 records with the highest vavlue?

查询所有分区的唯一方法是使用完整的 table Scan。但这不提供排序和排序。您仍然需要在您的应用程序中执行此操作。扫描效率会比 分散读取 .

低很多

如果这是一个 "Top 3 sellers" 类型列表...我相信建议的做法是(定期)计算并存储结果。而不是必须不断地得出结果。看这里:Using Global Secondary Indexes for Materialized Aggregation Queries