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

J. *_*ers 5 amazon-web-services amazon-dynamodb dynamodb-queries

在DynamoDB的文档中,它说:

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

和:

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

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

Nad*_*'El 11

确实,你的解释是正确的。使用KeyConditionExpression,DynamoDB 可以高效地仅获取符合其条件的数据,您只需为这些匹配数据付费,1MB 读取大小适用于匹配数据。但FilterExpression情况有所不同:DynamoDB 没有有效的方法来过滤掉不匹配的项目,然后再实际获取所有不匹配的项目,然后过滤掉您不想要的项目。所以你为读取整个未过滤数据(之前FilterExpression付费,最大 1MB 也对应于未过滤数据。

如果您仍然不相信这是应该的方式,那么这里有另一个需要考虑的问题:想象一下,您的数据库中有 1 GB 的数据要被扫描(或在单个键中被查询),过滤后,结果将仅为 1 KB。如果您进行此查询并希望返回 1 KB,Dynamo 将需要在返回之前读取和处理整个 1 GB 数据。这可能需要很长时间,而且您不知道需要多少时间,并且在等待结果时可能会超时。因此,Dynamo 会确保在从磁盘读取每 1MB 数据后返回给您(您为此付费 ;-))。在长查询期间,控制将返回给您 1000 (=1 GB / 1 MB) 次,您将没有机会超时。

顺便说一句,该Scan文档包含了对 1MB 限制的解释的措辞略有不同的版本,也许您会发现它比Query文档中的版本更清晰:

单个 Scan 操作将读取设置的最大项目数(如果使用 Limit 参数)或最大 1 MB 的数据,然后使用 FilterExpression 对结果应用任何过滤。