dynamodb 中的查询与扫描操作

Posted

技术标签:

【中文标题】dynamodb 中的查询与扫描操作【英文标题】:Query Vs Scan operation in dynamodb 【发布时间】:2020-08-14 06:55:35 【问题描述】:

背景

我目前正在尝试根据我拥有的数据库设计找出在 lambda 函数中计算某些统计数据的最佳方法。假设我有来自中国的用户记录,其中有 23 个省份,我存储在一个数组中,我想确定女性和男性的总数,以及每个省份的用户数。

给定一个包含 200,000 个项目的 GSI 表,每个项目的总大小为 100 字节,如下所示,省属性是分区键。


  "createdAt": 
    "S": "2020-08-05T19:21:07.532Z"
  ,
  "gender": 
    "S": "Male"
 ,
 
  "updatedAt": 
    "S": "2020-08-05T19:21:07.532Z"
  ,
 "province": 
    "S": "Heilongjiang"
  

我正在考虑使用两种方法进行此计算:

1.查询方法

我计划循环遍历省数组,并在每个循环上为查询方法提供一个分区键,这最终会发出过多的请求(准确地说是 23,也就是说,如果返回的每个请求都没有超过1MB 这可能会导致我不断重复,直到当前查询不再有 lastEvaluationKey)。

2.扫描方法

在这种方法中,我会反复向数据库发出请求,直到没有 lastEvaluationKey。

了解扫描和查询方法都只能返回 1mb 的数据,哪种方法最适合在这个特定用例中使用?

我正在考虑使用扫描方法,因为我需要读取表中的所有数据才能计算统计数据;但是,我担心随着表的增长,操作会变得多么缓慢。

PS:对于不同的 keySchema 以更好地访问的建议也将不胜感激。

【问题讨论】:

【参考方案1】:

都没有。

在您的 DDB 表中创建/更新/删除记录时,使用 DDB Streams + Lambda 更新您的统计数据。

另请参阅Using Global Secondary Indexes for Materialized Aggregation QueriesHow to do basic aggregation with DynamoDB?

【讨论】:

您的意思是每当事件发生时添加一个 lambda 触发器对吗?这听起来很有希望,非常感谢!我一定会立即检查的!

以上是关于dynamodb 中的查询与扫描操作的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDb:扫描查询不会返回所有数据

Dynamodb - 转换枚举器集合

DynamoDB - 如何计算查询的读取吞吐量

从 EC2 实例查询 DynamoDB 时遇到高延迟

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

我们可以避免在 dynamodb 中进行扫描吗