DynamoDB扫描/查询返回x项目数

时间:2018-03-11 00:11:24

标签: amazon-web-services amazon-dynamodb

如果我在DynamoDB中扫描或查询,则可以设置Limit属性。 DynamoDB documentation说明如下:

  

要评估的最大项目数(不一定是   匹配项目。)

所以问题就是如果你设置了过滤器,那么它就不会返回所有项目。

我试图弄清楚如何实现的目标是在扫描或查询中使用过滤器,但让它返回x个项目。无论。我必须使用LastEvaluatedKey并提出多个请求,但我想尽量使其尽可能无缝且简单(所以不要这样做是最好的。

我想到的唯一方法是将Limit属性设置为1或其他。然后使用LastEvaluatedKey继续扫描或查询,直到我找到我正在寻找的x个项目。问题是,这似乎非常浪费且效率低下。我的意思是,如果你有一张包含数百万条记录的表,你可能需要制作成千上万的请求。它似乎没有很好地扩展。当然,我确信它与DynamoDB在幕后所做的一样没有什么不同。

但有没有办法更有效地做到这一点,我可以减少我必须提出的请求数量?或者这是实现这一目标的唯一方法吗?

你将如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

  

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

你100%正确,在FilterExpression之前应用了限制。含义Dynamo可能返回一些小于Limit的数字或文档,而满足FilterExpression的其他文档仍然存在于表中但未返回。

听起来你的api以同样的方式行事是不可接受的。这意味着在某些情况下,对您的服务的单个请求将导致对Dynamo的多个请求。另外,请记住,没有办法预测LastEvaluatedKey将并行化这些请求所需的内容。因此,如果您的服务向Dynamo发出多个请求,它们将是串行的。对我来说,这是一个相当沉重的权衡,但是,如果要求您尽可能满足限制,您可以选择。

首先,Dynamo将以1 MB的速度自动翻页。这意味着您可以在没有限制的情况下将查询发送到Dynamo,并在结束时实施限制。您可能仍需要发出多个请求以确保您已满足限制,但此方法将导致对Dynamo的请求数量最少。这里的权衡是读取和传输的总数据。有可能你的极限不会与1 MB的限制完美排列,这意味着读取,过滤和传输的多余数据被浪费了。

您已经提到了发送限制为1的另一个极端,并指出这将导致对Dynamo的最大请求数

沿着这些方向的另一种方法是创建某种概率函数,该函数接受客户端给予服务的限制并计算新的Dynamo限制。例如,您的FilterExpression会过滤掉表中大约一半的文档。这意味着您可以将客户端限制乘以2,这将是发送给Dynamo的合理限制。在我们迄今为止谈到的方法中,这个方法具有最高的效率潜力,但它也具有最高的复杂性潜力。例如,您可能会发现使用简单的线性函数不够好,而是需要使用机器学习来查找多变量非线性函数来计算新的限制。这种方法在很大程度上还取决于Dynamo中数据的一致性以及访问模式。同样,您可能需要机器学习来优化这些变量。

在您实施限制结束的任何情况下,如果您计划将LastEvaluatedKey发送回客户端以便后续拨打您的服务,您还需要注意跟踪评估的LastEvaluatedKey。您将无法再依赖Dynamo返回的LastEvaluatedKey

最后一种方法是使用GSI重组/重新组合数据,使用Dynamo Streams保持同步的单独表或完全不同的模式,目标是不需要FilterExpression。