DynamoDB-分区分组还是分片?

时间:2019-07-04 19:07:27

标签: amazon-web-services amazon-dynamodb dynamodb-queries

因此,在浏览DynamoDB文档时,他们通常建议您将同一分区中相关的Togheter项目“分组”,以便更好地分配您的分区使用情况。

以下面的示例为例,我们的用户在其分区内具有联系人和发票:

enter image description here

因此,如果我需要所有user_001的发票,我将只查询(伪):

QUERY WHERE PartitionKey = "user_001" AND SortKey.begins_with("invoice_")

但是我最近注意到,当您使用上述方法时,存在很大的问题。

您会看到,DynamoDB将在整个user_001分区内搜索发票,并将根据搜索到的所有项目(无论是否在发票上)消耗读取容量。

如果您的分区太大,这可能会导致效率低下,比如说我有10,000个联系人和2张发票,要获得这2张发票可能会非常昂贵。

我假设这是基于文档的引用:

  

DynamoDB根据以下内容计算消耗的读取容量单位数:   项目大小,而不是返回给数据库的数据量   应用

解决方案:

enter image description here

这不是更好的方法吗?

1)它可以更好地分片数据,所以我不需要使用starts_with

2)它允许我使用基于时间的uuid作为排序键并启用更复杂的排序/分页

3)我将减少查询的容量,因为它不需要处理不需要的内容

有什么问题吗?

好吧,我上面所说的只是理论和假设,文档并不清楚它在幕后的实际工作原理,甚至建议使用图1。

但是我真的认为图2是这里最好的,特别是当您考虑到现在DynamoDB可以在整个分区中智能地分配容量(并且不像以前那样均匀地分配)时

那么,我认为图2优于1的观点是否有效?

1 个答案:

答案 0 :(得分:0)

您的假设有误-您引用的文档适用于过滤器表达式。

如果您有一个适用于您的排序键的条件,则该条件应该是查询表达式的一部分,而不是过滤器表达式。