Amazon dynamodb DynamoDB查询少值属性的最佳实践

Amazon dynamodb DynamoDB查询少值属性的最佳实践,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我在DynamoDB中有一个表,其中包含如下属性: OrderId、OrderJson、OrderStatus 订单状态的值可以是0或1。 我需要能够更新指定订单的状态,并根据状态字段获取订单。 其中一个选项是使用scan,另一个选项是使用status作为分区键的辅助索引,但是status字段的值范围很小。 请建议所述需求的最佳实践是什么? 谢谢 我不会选择scan,因为它既不划算也不特别高效,除非你的订单很少 简而言之,使用全局二级索引是正确的。(我想你说的是全局二级索引。也有本地二级索引,但

我在DynamoDB中有一个表,其中包含如下属性:

OrderId、OrderJson、OrderStatus

订单状态的值可以是0或1。 我需要能够更新指定订单的状态,并根据状态字段获取订单。 其中一个选项是使用scan,另一个选项是使用status作为分区键的辅助索引,但是status字段的值范围很小。 请建议所述需求的最佳实践是什么?
谢谢

我不会选择scan,因为它既不划算也不特别高效,除非你的订单很少

简而言之,使用全局二级索引是正确的。(我想你说的是全局二级索引。也有本地二级索引,但我不认为这些索引对这个案例有多大帮助

无论如何,我将创建一个GSI,其中OrderStatus作为散列键,OrderId作为范围键

1) 写入吞吐量。请记住,具有相同订单状态的订单将写入GSI上的同一磁盘。这正是Dynamo的工作方式,具有相同哈希键的文档将被放在同一个位置。这意味着,无论表的写入吞吐量设置为多少,单个磁盘上的写入吞吐量都有一个上限。确保你不会超过这个上限

2) 读取吞吐量。与写入吞吐量几乎相同,但用于读取。读取限制高于写入限制,但仍需注意

3) 寻呼。每当您使用散列键(在本例中为OrderStatus)查询Dynamo表时,它将自动将响应大小限制为1MB。因此,您可能需要发出多个顺序查询请求来读取特定OrderStatus的所有订单

好在所有这些问题都有基本相同的解决方案,“切分”。在本例中,我所说的切分是在OrderStatus中添加后缀。例如,如果OrderStatus可以是1或0,您将创建另一个字段,例如OrderShard,它可以是1_0、1_1、1_2、…、1_9、0_0、0_1、0_2、…、0_9。我们基本上只是在OrderStatus的末尾添加一个介于0和9之间的随机整数,以便在GSI上创建更多可能的散列键值。这意味着您的数据将分布在更多的磁盘上,解决1和2,您可以进行并行查询请求,大部分情况下解决3


不再使用OrderStatus作为GSI上的哈希键,现在您将使用OrderShard。仍然使用OrderId作为范围键。此外,如果每个OrderStatus值10个碎片还不够,只需增加碎片的数量即可。例如,添加0-99之间的随机数。您需要多少碎片取决于您的规模和吞吐量。

谢谢您的详细回复!