Amazon web services DynamoDb PutItem与UpdateItem之间的差异?

Amazon web services DynamoDb PutItem与UpdateItem之间的差异?,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,基于DynamoDb文档,为什么会有人使用updateItem而不是putItem PutItem-将单个项目写入表中。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个 UpdateItem-修改表中的单个项目。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,UpdateItem仍将消耗全部调配的吞吐量(项目大小“之前”和“之后”中的较大者) 两者之间的主要区别是,Pu

基于DynamoDb文档,为什么会有人使用
updateItem
而不是
putItem


  • PutItem
    -将单个项目写入表中。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个
  • UpdateItem
    -修改表中的单个项目。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,
    UpdateItem
    仍将消耗全部调配的吞吐量(项目大小“之前”和“之后”中的较大者)

两者之间的主要区别是,PutItem将替换整个项目,而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的方法?