DynamoDb PutItem与UpdateItem之间的区别?


75

基于DynamoDb文档,为什么有人会updateItem代替使用putItem


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

Answers:


125

两者之间的主要区别是,PutItem将替换整个项目,而UpdateItem将更新它。

例如。

我有一个类似的项目:

userId = 1
Name= ABC
Gender= Male

如果我将PUT项目与

UserId = 1
Country = India

这将替换名称和性别,现在新的项目是用户ID和国家/地区。如果您想从中更新项目,Name = ABC to Name = 123则必须使用UpdateItem

您可以使用Put item对其进行更新,但是您需要发送所有参数,而不仅是要更新的Parameter,因为它会用new属性替换该项目。(内部会删除该项目并添加新项目)

希望这有意义。


谢谢Harshal,在我的用例中,我总是覆盖每个唯一字段(partitionKey + sortKey)的所有字段。我想知道是否可以使用updateItem而不是PutItem减轻一些性能开销。但似乎,内部它们的工作方式相同(内部它删除项目并添加新项目)。
Sindhu

2
使用update而不是对性能影响有任何想法put吗?
阿米尔·卡里米

4
@AmirKarimi,基本上Put将在内部执行3个操作FindKey-> Delete-> Add and update将执行FindKey-> Update,所以我认为更新会更快
Harshal Bulsara

注意:在上面的示例中,如果我们使用“ UserId = 1 Country = India”进行PUT项目,它将删除属性“ Name = ABC”。就像Harshal Bulsara提到的那样,它将删除它,然后添加新项目
Juggernaut20年

16

PutItem用传递的新版本覆盖整个项目(所有属性),而UpdateItem只会更新传递的属性

性能PutItem如果您覆盖整个项目的频率如此之高,则可能会影响性能,因为它涉及的操作比UpdateItemFindItem,DeleteOldVersion和AddNewVersion多

从预期的成本来看,它也有所不同:

AWS根据使用的读/写容量单位(与要覆盖/更新的项目的大小完全相关)来计算成本。

的情况下 PutItem,则大小将为该项目的新旧版本中的较大者。例如,将2 KB项目替换为1 KB,它将消耗2个WCU,但是后续请求将仅使用1个WCU。因此,如果您经常覆写,并且商品的尺寸变化很大,那将总是计算出商品的较大版本并影响成本。

如果使用修改项目UpdateItem,则大小包括项目的所有预先存在的属性,而不是包括PutItem:)之类的较大版本,而且不仅包括要添加或更新的属性:(


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.