BatchGetItem和DynamoDB中的Query之间有什么区别?

suv*_*suv 34 amazon-web-services amazon-dynamodb aws-sdk

我一直在浏览AWS DynamoDB文档,并且在我的生命中,无法弄清楚batchGetItem()和Query()之间的核心区别是什么.两者都根据表和索引中的主键检索项目.唯一的区别在于检索到的项目的大小,但这似乎不是突破性的差异.两者都支持条件更新.

在什么情况下我应该使用batchGetItem而不是Query,反之亦然?

ste*_*ane 32

根据官方文档:http: //docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations

对于BatchGetItem,批处理中的每个项目都是单独读取的,因此DynamoDB首先将每个项目的大小向下舍入到下一个4 KB,然后计算总大小.结果不一定与所有项目的总大小相同.例如,如果BatchGetItem读取1.5 KB项目和6.5 KB项目,DynamoDB将计算大小为12 KB(4 KB + 8 KB),而不是8 KB(1.5 KB + 6.5 KB).

对于Query,返回的所有项都被视为单个读操作.因此,DynamoDB计算所有项目的总大小,然后向上舍入到下一个4 KB边界.例如,假设您的查询返回10个项目,其组合大小为40.8 KB.DynamoDB将操作的项目大小舍入为44 KB.如果查询返回1500个项目,每个64字节,则累计大小为96 KB.

所以,只有当你的项目都相对较大时才应该使用BatchGetItem(因此4KB的总结会产生很小的影响),并且你需要在一次调用中检索> 1MB.

在任何其他情况下,使用查询,否则你最终将被收取更多的费用;)

  • 虽然这个答案很好地解释了定价如何适用于DynamoDB,但它有点误导,因为它似乎给人的印象是Query可能被用来取代BatchGet.我的理解是它不能.见[这个答案](http://stackoverflow.com/questions/31633141/batchgetitem-or-query-dynamodb-query-by-range) (14认同)

Mir*_*cea 19

简而言之:BatchGetItem在表上工作,并使用哈希键来标识要检索的项目.您可以在响应中获得最多16MB或100个项目

查询适用于表,本地二级索引和全局二级索引.您可以在响应中获得最多1MB的数据.最大的区别是查询支持过滤表达式,这意味着您可以请求数据,DDB将为您过滤服务器端.

如果你想要使用其中任何一个,你可能会做同样的事情,但是当你需要从DDB批量转储东西并且你需要缩小你的范围时,你可以做一个BatchGet规则想要检索(并且您希望发电机为您重复过滤数据).


Cra*_*ker 9

其他答案缺少一个重要的区别:

  • 查询需要分区
  • BatchGetItems需要

仅当您要获取的项目碰巧共享一个分区(哈希)键,并且必须提供此值时,查询才有用。此外,您必须提供准确的值;您不能对分区键进行任何部分匹配。在这里,您可以为sort键指定一个附加(可能是部分/条件)值,以减少读取的数据量,并通过FilterExpression进一步减少输出。这很好,但是它有一个很大的局限性,即您无法获取驻留在单个分区之外的数据。

BatchGetItems是与此相反的一面。您可以跨多个分区(甚至跨多个表)获取数据,但是您必须知道完整且确切的主键:即分区(哈希)键任何排序(范围)。从字面上看,就像在单个操作中多次调用GetItem。您没有Query的部分搜索和过滤选项,但您也不限于单个分区。

  • 这个答案对我来说是最清楚的,我觉得它应该被接受。 (5认同)
  • 极好的答案。当我想弄清楚为什么我提供哈希键时BatchGetItem无法正常工作时,我的大脑不知所措,却忘了它期望哈希+范围键。当我有N个哈希ID而没有任何范围键时,我最终仅触发N个并发请求以运行N个查询。当然了。总比没有好。最好具有对BatchQuery的支持,该查询采用哈希/分区键的列表并返回所有相关结果。 (2认同)

Sud*_*han 5

DynamoDB 将值存储在两种键中:单个键,称为分区键,例如"jupiter"; 或复合分区和范围键,例如"jupiter"/"planetInfo","jupiter"/"moon001""jupiter"/"moon002"

ABatchGet可以帮助您同时获取大量键的值。这假设您知道要获取的每个项目的完整密钥。BatchGet("jupiter", "satrun", "neptune")因此,如果您只有分区键,或者BatchGet(["jupiter","planetInfo"], ["satrun","planetInfo"], ["neptune", "planetInfo"])使用分区+范围键,则可以执行 a 。每个项目都是独立收费的,费用与个人获得的费用相同,只是结果是批量的,并且调用节省了时间(而不是金钱)。

Query另一方面,A仅在分区 + 范围键组合内工作,可帮助您查找您不一定知道的项目和键。如果你想数木星的卫星,你会做一个Query(select(COUNT), partitionKey: "jupiter", rangeKeyCondition: "startsWith:'moon'")。或者,如果您想要获取卫星,则不。7到15你会做的Query(select(ALL), partitionKey: "jupiter", rangeKeyCondition: "BETWEEN:'moon007'-'moon015'")。在这里,您需要根据查询读取的数据项的大小付费,而不管有多少数据项。