DynamoDB:1MB的查询限制何时适用

时间:2019-06-17 12:35:14

标签: amazon-web-services amazon-dynamodb dynamodb-queries

在DynamoDB的docs中,它说:

  

在查询操作中,DynamoDB按排序顺序检索项目,然后使用KeyConditionExpression和可能存在的任何FilterExpression处理项目。

并且:

  

单个查询操作最多可以检索1 MB的数据。在将任何FilterExpression应用于结果之前,此限制才适用。

这是否意味着在此1MB限制之前应用了KeyConditionExpression

1 个答案:

答案 0 :(得分:3)

确实,您的解释是正确的。使用KeyConditionExpression,DynamoDB可以有效地仅提取与其条件匹配的数据,而您只需为该匹配数据付费,并且1MB的读取大小适用于匹配数据。但是对于FilterExpression来说情况就不同了:DynamoDB没有有效的方法来过滤掉不匹配的项目,然后才真正提取所有不匹配的项目,然后然后过滤掉不需要的项目。因此,您付费以读取整个未经过滤的数据(在FilterExpression之前),并且最大1MB也对应于未经过滤的数据。

如果您仍然不确定应该采用这种方式,那么还需要考虑以下另一个问题:假设您的数据库中有1 GB的数据要扫描(或在单个键中查询)。 ed),并且经过过滤后,结果将仅为1 KB。如果您要进行此查询并希望取回1 KB,Dynamo将需要读取并处理整个1 GB的数据,然后再返回。这可能会花费很长时间,并且您不知道要多少,并且在等待结果时可能会超时。因此,Dynamo会确保从磁盘读取的每1MB数据(并为此您支付;-)之后返回给您。在长查询期间,控制权将返回1000次(= 1 GB / 1 MB),并且您将没有机会超时。我不知道1MB的限制在这里是否有意义还是应该更大,也许我们应该对响应大小和读取量有不同的限制-但是绝对需要对读取进行某种限制金额,即使它不会转化为较大的响应。

顺便说一句,Scan文档中的1MB限制说明的措词略有不同,也许您会发现它比Query文档中的版本更清晰:

  

一次扫描操作将读取最多设置的项目数(如果使用Limit参数)或最多1 MB的数据,然后使用FilterExpression对结果进行任何过滤。