如何将 dynamodb 扫描限制到给定的分区键而不是读取整个 table

How to limit dynamodb scan to a given partition key and NOT read the entire table

理论上 table 有数十亿个条目。

分区键是代表给定设备 ID 的唯一 uuid。将有大约 10k 个唯一的 uuid。

排序键是数据收集时间的日期字符串。

每个项目都有一些数据字段。有几十个字段,因此为每个字段制作一个 GSI 是不合理的。对于我们的示例,假设我们正在寻找“dataOfInterest”字段。

我想在数据库中搜索“dataOfInterest = 'foobar' 的所有项目”- 最好在一个日期范围内进行搜索。据我所知,扫描操作是唯一的选择。有数十亿个条目......这不会是一个快速的过程(虽然我知道我可以一次将它分成 运行 多个操作 - 它仍然会像疯了一样吃掉 RCU)

值得注意的是,我只关心每次搜索的给定 uuid。换句话说,我真正关心的是“dataOfInterest = 'foobar' 的给定分区 中的所有项目 ”。此外,最好使用排序键给出“给定分区 内的所有项目 ,其中 dataOfInterest = 'foobar' 介于 1 月 1 日和 2 月 28 日之间”

扫描操作允许您使用过滤表达式限制结果,这样我就可以获得单个分区的结果......但它仍然读取整个 table 并且过滤在之前完成返回数据给你。 https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

是否有 AWS API 执行仅读取给定分区的类似扫描操作?是否有其他方法可以实现此目的(也许重新架构数据库?)

如@jarmod 所说,您可以使用查询并指定 UUID 的 PK。然后,您可以将时间戳放入 SK 中并过滤 dataOfInterest 值(未索引),或者为了提高效率并使所有内容都被索引,您可以构建一个 dataOfInterest#timestamp 的复合 SK,然后对foobar#time1foobar#time2 的 SK。这使得这个查询完美地优化了索引。

当然,这会使纯粹的 timestamp-based 查询变得不那么简单。因此,您要么对这些进行多个查询,要么,如果您希望两个查询都有效,请在 GSI 中设置此复合 SK 并使用它来解决此查询。