在DynamoDB的docs中,它说:
在查询操作中,DynamoDB按排序顺序检索项目,然后使用
KeyConditionExpression
和可能存在的任何FilterExpression
处理项目。
并且:
单个查询操作最多可以检索1 MB的数据。在将任何
FilterExpression
应用于结果之前,此限制才适用。
这是否意味着在此1MB限制之前应用了KeyConditionExpression
?
答案 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对结果进行任何过滤。