Amazon web services DynamoDb PutItem与UpdateItem之间的差异?
基于DynamoDb文档,为什么会有人使用Amazon web services DynamoDb PutItem与UpdateItem之间的差异?,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,基于DynamoDb文档,为什么会有人使用updateItem而不是putItem PutItem-将单个项目写入表中。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个 UpdateItem-修改表中的单个项目。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,UpdateItem仍将消耗全部调配的吞吐量(项目大小“之前”和“之后”中的较大者) 两者之间的主要区别是,Pu
updateItem
而不是putItem
-将单个项目写入表中。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个PutItem
-修改表中的单个项目。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,UpdateItem
仍将消耗全部调配的吞吐量(项目大小“之前”和“之后”中的较大者)UpdateItem
userId = 1
Name= ABC
Gender= Male
如果我使用PUT item with
UserId = 1
Country = India
这将取代姓名和性别,现在新的项目是UserId和Country。
而如果要将项目从Name=ABC更新为Name=123
则必须使用UpdateItem
您可以使用Put item来更新它,但您需要发送所有参数,而不仅仅是要更新的参数,因为它会用新属性替换该项。(在内部,它会删除该项并添加新项)
希望这是有意义的。
PutItem
通过传递新版本覆盖整个项目(所有属性),而UpdateItem
只更新传递的属性
性能:PutItem
如果经常覆盖整个项目,可能会影响性能,因为它涉及的操作比UpdateItem
FindItem、DeleteOldVersion和AddNewVersion更多
从成本角度来看,也不同:
AWS根据使用的读/写容量单位计算成本,该单位与被覆盖/更新的项目的大小完全相关
如果是PutItem
,则大小将为该项目新版本和旧版本中的较大者。例如,将2 KB的项目替换为1 KB,它将消耗2个WCU,但后续请求将仅使用1个WCU。因此,如果您经常覆盖,并且项目的大小变化很大,那么将始终计算项目的较大版本,并影响成本
在使用
UpdateItem
修改项目的情况下,大小包括项目的所有预先存在的属性,而不是像PutItem
:)这样的较大版本,也不仅仅是添加或更新的属性:(上述答案中的轻微更正:即使是更新项目API也会采用两个项目大小中较大的一个(更新前和更新后)考虑在内。请参阅文档。谢谢Harshal,在我的使用案例中,我总是覆盖每个唯一项(partitionKey+sortKey)的所有字段。我想知道是否可以使用updateItem而不是PutItem来减轻一些性能开销。但在内部,它们的工作方式似乎是相同的(在内部删除项目并添加新项目)。使用update
而不是put
,了解性能影响吗?@AmirKarimi,基本上put将在内部执行3个操作FindKey->Delete->Add和update将执行FindKey->update,因此我认为更新会更快注意:在上面的示例中,如果我们使用“UserId=1 Country=India”,它将删除属性“Name=ABC”".就像Harshal Bulsara提到的,它会删除它,然后从成本角度添加新项目,这不是很令人沮丧吗?我想在列表属性上添加一点数据。为什么我会消耗整个项目的写入容量?这种情况下有解决方法吗?比方说,我添加的数据大约是50字节。我的项目是200 kb。正确的方法是什么使用最小WCU的方法?