DynamoDB中基于索引的单项检索,query()与getItem()哪个更好?

77
如果我根据索引的哈希键检索表中的单个项目,那么在使用 query() 或者 getItem() 时是否存在性能差异?
4个回答

58

getItem 将更快

getItem 通过哈希和范围键检索是一种完美的匹配,因此检索所需时间(性能)受到内部哈希和分片的限制。

查询结果在搜索“所有”范围键时添加了计算工作,因此被认为比较慢。

编辑:为了快速比较,附上来自此博客文章的以下图片。

决策图表,选择使用哪个检索函数


1
什么是范围键?你的意思是排序键吗? - Sebastian Nielsen
2
@SebastianNielsen在早些年(这个回答是来自2012年!)DynamoDB称之为<Hash,Range>。然后在文档API发布的时候,对话转向了<Partition,Sort>。 - Chen Harel

30

在亚马逊的DynamoDB中,无论使用何种访问方式,您都可以保证性能(需要支付费用)。

正如Chen Harel所建议的那样,DynamoDB服务器本身可能会有几毫秒的差异,但由于HTTP请求的往返时间(RTT),这些差异微不足道

尽管如此,当您拥有足够的信息时,最好发出GET而不是QUERY请求,这是一个好习惯


18
就算在 HTTP 请求的情境下,这几毫秒的差异也可能在大规模应用中产生很大的影响。DynamoDB 额外的 2-3 毫秒延迟可能会导致请求在网站服务器和后端服务之间多占用 2-3 毫秒时间,从而捆绑资源。 - Annabelle
6
人们关注性能是很好的。当我们谈论2-3毫秒的优化时,世界上真正需要考虑这种优化的网络服务并不多。99%的网络服务甚至不会注意到这种微小的延迟。 - infinity1975

26

正如aws员工在讨论中建议的那样,我引用:

使用limit=1的Query和GetItem的延迟是相当的。

AWS讨论链接


4
链接已过期。 - Mr. N

-1

这两者之间没有性能差异。两个查询中的哈希计算都是逐个完成的。 后者,即getItem仅作为类比JPA repository / spring findOne / findById,并使Spring Bean wiring / Hibernate配置更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接