因此,在浏览DynamoDB文档时,他们通常建议您将同一分区中相关的Togheter项目“分组”,以便更好地分配您的分区使用情况。
以下面的示例为例,我们的用户在其分区内具有联系人和发票:
因此,如果我需要所有user_001的发票,我将只查询(伪):
QUERY WHERE PartitionKey = "user_001" AND SortKey.begins_with("invoice_")
但是我最近注意到,当您使用上述方法时,存在很大的问题。
您会看到,DynamoDB将在整个user_001分区内搜索发票,并将根据搜索到的所有项目(无论是否在发票上)消耗读取容量。
如果您的分区太大,这可能会导致效率低下,比如说我有10,000个联系人和2张发票,要获得这2张发票可能会非常昂贵。
我假设这是基于文档的引用:
DynamoDB根据以下内容计算消耗的读取容量单位数: 项目大小,而不是返回给数据库的数据量 应用
解决方案:
这不是更好的方法吗?
1)它可以更好地分片数据,所以我不需要使用starts_with
2)它允许我使用基于时间的uuid作为排序键并启用更复杂的排序/分页
3)我将减少查询的容量,因为它不需要处理不需要的内容
有什么问题吗?
好吧,我上面所说的只是理论和假设,文档并不清楚它在幕后的实际工作原理,甚至建议使用图1。
但是我真的认为图2是这里最好的,特别是当您考虑到现在DynamoDB可以在整个分区中智能地分配容量(并且不像以前那样均匀地分配)时
那么,我认为图2优于1的观点是否有效?
答案 0 :(得分:0)
您的假设有误-您引用的文档适用于过滤器表达式。
如果您有一个适用于您的排序键的条件,则该条件应该是查询表达式的一部分,而不是过滤器表达式。