DynamoDb大表查询速度

时间:2018-12-30 13:06:28

标签: .net amazon-dynamodb dynamodb-queries

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

发电机db的正常速度吗?

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

匹配项:

account_id = 3

AND book_id = 10

AND reader_id = 222

我知道我需要对此表进行扫描

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

一张桌子有4000万个物品吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

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

维护两个表,一个表已经创建,另一个表用于存储计算值,

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

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

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

方法的优点

  1. 无需扫描。

缺点

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

在上述建议的方法中,如果仅在第一个表中对计算值使用特殊的辅助键,则可以删除2个表。但会出现类似问题

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

  2. 种族条件将出现在其中两个请求同时尝试更新同一记录的地方。 (因此,lambda函数的并发性较低,因此 2个线程无法在同一记录上工作。)

  3. 原子性:如果第二次写入失败,我们可能必须还原第一笔看跌期权。