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

Cha*_*ish 5 amazon-web-services amazon-dynamodb

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

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

所以这个问题是如果你设置过滤器,它不会返回所有项目。

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

我想这样做的唯一方法是将Limit属性设置为 say1或其他内容。然后继续使用 进行扫描或查询,LastEvaluatedKey直到我达到我正在寻找的 x 个项目。问题是,这似乎非常浪费和低效。我的意思是,如果您有一个包含数百万条记录的表,您可能需要发出数以千计的请求。看起来它的扩展性不是很好。当然,我确信这与 DynamoDB 在幕后所做的没有什么不同。

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

你将如何实现这个目标?

tle*_*eef 3

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

您 100% 正确地认为 Limit 在 FilterExpression 之前应用。这意味着 Dynamo 可能会返回一些小于限制的数字或文档,而满足 FilterExpression 的其他文档仍然存在于表中但不会返回。

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

首先,Dynamo 将自动以 1 MB 进行分页。这意味着您可以简单地将查询发送到没有限制的 Dynamo,并在您的端实现限制。您可能仍需要发出多个请求以确保满足限制,但此方法将导致向 Dynamo 发出的请求数量最少。这里的权衡是读取和传输的总数据量。您的限制很可能不会与 1 MB 限制完美一致,这意味着读取、过滤和传输的多余数据会被浪费。

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

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

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

最后的方法是使用 GSI(使用 Dynamo Streams 保持同步的单独表)或完全不同的架构来重新组织/重新分组数据,目标是不需要 FilterExpression。