在dynamodb中查询VS扫描操作

问题描述

背景

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

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

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

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

1. 查询方法

我计划循环遍历Province数组,并在每个循环上向查询方法提供一个分区键,这最终将导致发出过多请求(准确地说,这是23个,即返回的每个请求未超过的限制) 1MB,这可能会使我不断重复,直到当前查询没有更多的lastEvaluationKey为止。

2. 扫描方法

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

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

我正在考虑使用扫描方法,因为无论如何我都需要读取表中的所有数据以计算统计信息;但是,我担心表增长时操作将变得多么缓慢。

PS:建议使用其他keySchema以获得更好的访问。

解决方法

都不是。

在DDB表中创建,更新/删除记录时,请使用DDB流+ Lambda更新统计信息。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...