pagination - 使用带有分页的 DynamoDB 扫描操作而不是使用 GSI 查询是否正确,我需要表中的所有项目
问题描述
我读到数据很大时发电机数据库扫描操作很慢。但我想知道,有一个场景来提取所有项目。是否仍然首选避免扫描?考虑到索引不是免费的,并且我需要表中的所有项目,我将采用这种方法。
- 请通过选择扫描操作建议他们是否有任何问题?
- 为什么只有 scan 有并行扫描选项,默认查询是并行的?
- 如果我将查询操作与分页一起使用,它将按顺序运行还是并行运行?
解决方案
如果您需要所有项目,那么 Scan() 非常好。
只要意识到 DDB
- 一次仅返回 1MB 的数据,因此您需要使用
ExclusiveStartKey
:=循环调用LastEvaluatedKey
- Scan() 可以快速消耗您配置的 RCU,因此请注意油门错误并重试。
反对 Scan() 的建议是尝试使用 Scan() + filter 代替 Query() 记录子集。Scan() 总是读取整个表。
另请注意,从性能角度来看,Scan() 支持并行扫描。
TotalSegments
对于并行扫描请求,TotalSegments 表示扫描操作将被分成的段的总数。TotalSegments 的值对应于将执行并行扫描的应用程序工作人员的数量。例如,如果要使用四个应用程序线程来扫描表或索引,请将 TotalSegments 值指定为 4。
但同样,如果使用预置读取......并行扫描将很快耗尽 RCU。
推荐阅读
- reporting-services - SSRS 和浏览器之间的渲染不一致导致表格未对齐
- laravel - 如何检查表单是否在laravel中提交?
- javascript - Chrome 在记录克隆的 SVGElement 时添加属性 [requiredExtensions, systemLanguage]
- c# - 存储库仅在本地开发环境中获取数据
- javascript - puppeteer API 未触发 click 事件
- android - 我们可以使用自定义应用程序更改设备时间吗?
- code-signing - 签名设置:UAC 黄色
- php - [vtiger][Webservice] 执行请求的操作时出现数据库错误
- printf - 在同一个 printf 中使用多个 fgetc 时结果反转
- docker - 如何使用 elasticsearch 配置 Jaeger?