【问题标题】:DynamoDb Large table query speedDynamoDb 大表查询速度
【发布时间】:2025-12-29 19:35:16
【问题描述】:

我们正在从 mysql 迁移到 dynamo db 在此之前我有一些问题

我的 mysql 表上有 4000 万个项目

有一个开始,我将 225,000 移动到 dynamo db 上的一张桌子上,以测试它是否值得

我的对象如下所示:

"Partition key"{
             account_id:number,
             book_id:1,
             reader_id:2,
             field:3,
             field:4,
             ...
}

我的第一个测试是通过 account_id 获取数据

所以我创建了 该字段的全局索引

我尝试了什么:

查询 account_id = 2 的所有数据 使用正确的索引

花了大约 90 秒 225,000 件商品已退回

dynamo db 的速度是否正常?

现在可以说我不需要返回实际的对象 我只需要计算有多少对象

匹配:

account_id=3

AND book_id=10

AND reader_id=222

我知道我需要为此扫描表格

什么是最好的方法 我可以期待这种扫描的“正常”速度吗

一张表有 4000 万个项目?

非常感谢

【问题讨论】:

  • 您永远不应该进行扫描。而是使用弹性搜索进行扫描,使用发电机进行放置和获取。
  • 在这种情况下我有什么选择?我必须使用扫描

标签: .net amazon-dynamodb dynamodb-queries


【解决方案1】:

Dynamodb 扫描很昂贵,几乎不应该使用,但是如果您的要求是这样的,您可以采取以下方法,

维护两张表,一张是您已经创建的,另一张是您存储计算值的,

您可以使用 dynamodb 流、lambda 函数来填充第二个表中的数据,这将确保

  1. 第一个表中操作的原子性和
  2. 当您在 lambda 中将并发设置为较小的数字时,它将解决第二个表中的竞争条件。

现在,只要您想计算数据,您就可以转到第二个表并获取数据。它将确保您不必进行扫描。

这种方法的优点

  1. 不必进行扫描。

缺点

  1. 将不得不维护 2 个表。
  2. 如果需求发生变化,我们可能不得不重新填充第二个表,这将是一项重大的工作。(PS 如果您使用 lambda 和 dynamo,这会变得更容易,首先清理第二个表。现在您只需更改一些随机字段您的第一个表的项目,它将通过管道,填充第二个表。)
  3. 数据可用性延迟。(因为数据填充是异步的)

在上述建议的方法中,如果您仅在第一个表中使用特殊的辅助键作为计算值,则可以摆脱 2 个表。但它会有类似的问题

  1. 您的表架构可能会演变,计算值可能没有这些值。 (比如定义一个新的辅助键?)(因此建议有 2 个表)

  2. 在两个请求同时尝试更新相同记录的情况下,将出现竞争条件。 (因此 lambda 函数的并发性较低,因此 2 个线程不在同一记录上工作。)

  3. 原子性:如果第二次写入失败,我们可能不得不恢复第一次放置。

【讨论】: