【问题标题】:DynamoDB Scan/Query Return x Number of ItemsDynamoDB 扫描/查询返回 x 项目数
【发布时间】:2018-08-19 07:10:11
【问题描述】:

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

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

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

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

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

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

您将如何实现这一目标?

【问题讨论】:

  • 为什么不能在回复中使用计数?
  • @mewa 我认为该属性是 DynamoDB 在响应中返回的项目数。那真的没有帮助。因为如果我有一个庞大的数据库,我不想扫描或查询比我必须做的更多。太浪费了。
  • 您的扫描量不会超出您的要求,因为查询的大小也是有限的 (1MB)。然后您将继续使用LastEvaluatedKey(并在此过程中增加计数)。
  • @mewa 好的,但是您不能拥有大量相对较小的记录吗?我的意思是,在这种情况下,不在请求中限制它只会很快耗尽你的能力。
  • 那么你必须设置一个适当的限制。这取决于许多因素。首先,您必须记住,读取容量以 4KB 的倍数计算。这意味着读取 4 个字节将与读取 4KB 一样昂贵。知道了这一点,您应该估计您的数据平均占用多少空间。您还应该考虑数据的分布。与任何 NoSQL 一样,您的解决方案必须专门针对您的用例进行设计。

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

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

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

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

首先,Dynamo 将自动以 1 MB 分页。这意味着您可以简单地将查询发送到 Dynamo,而无需限制并最终实施限制。您可能仍需要发出多个请求以确保您已满足限制,但这种方法将导致对 Dynamo 的请求数量最少。这里的权衡是读取和传输的总数据。您的限制可能不会与 1 MB 限制完美匹配,这意味着被读取、过滤和传输的多余数据被浪费了。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多