0

我们正在从 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

和 reader_id=222

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

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

一张桌子有 4000 万件物品?

非常感谢

4

1 回答 1

0

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

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

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

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

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

该方法的优点

  1. 不必进行扫描。

缺点

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

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

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

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

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

于 2018-12-31T01:06:00.350 回答