您正在执行的扫描会读取 DynamoDB 表中的每个项目,如果满足指定条件(segment_id__eq='xCrKYvnfZlm6VCQ',beat_id__gt=1,patient_id__eq='3854520.edf'),则将其返回。每次读取(即使项目不满足条件)都会消耗您预置的读取容量。如果您要检索单个记录,对 DynamoDB 使用GetItem或BatchGetItem调用将是最有效的,因为您只会消耗指定项目的读取容量。如果您要检索特定范围的记录,使用范围键或全局或本地二级索引会更有效,以便您可以查询这些项目,因为您只会消耗所有满足查询条件的项目的读取容量。您能否提供有关表架构的更多信息?
请参阅此开发人员指南,其中详细描述了扫描和查询之间的区别。
使用查询的一个例子是 segment_id 是散列键,beat_id 是范围键。您可以查询具有指定 segment_id 和指定 beat_id 范围的所有记录。这只会消耗检索那些特定记录所需的读取容量,而不是读取整个表。此外,您可以将查询过滤器应用于其他属性,例如 patient_id,以便只返回您想要的结果。
有关扫描/查询消耗容量的更多详细信息:
查询和扫描都是最终一致性读取,因此一个读取容量单元可以让您以高达每秒 8KB 的速度读取。
如果您仍然遇到限制,以下是一些缓解异常的方法:
- 增加请求之间的时间,以将您的读取率保持在您预置的读取容量之下。SDK默认重试限制异常。
- 增加您的预置读取容量以考虑项目大小和请求率。请参阅这些资源,了解预配置吞吐量的工作原理和计算项目大小。
有关扫描定价的更多详细信息:
要确定使用 Scan 或 Query 读取表中的项目需要多少读取容量:
- 弄清楚您正在阅读多少数据(将要读取的所有项目的大小相加)
- 向上舍入到最接近的 4KB 倍数
- 除以 4KB(强一致性读取)或 8KB(最终一致性读取)得到将消耗的容量单位数。
要确定使用 GetItem 或 BatchGetItem 读取表中的项目需要多少读取容量:
- 对于每个单独的项目,将该项目的大小四舍五入到最接近的 4KB 倍数
- 除以 4KB(强一致性读取)或 8kb(最终一致性读取)得到每个单独项目将消耗的容量单位数。
- 将每个项目将消耗的容量单位相加,得到将消耗的容量单位总数。
例如,假设我的表中有 10 个项目,它们都是 1KB,我计划通过最终一致的操作来检索它们。如果我使用 GetItem 检索它们,每个单独的项目将消耗 1/2 读取容量单位,因此总成本将为 1/2 * 10 = 5 个读取容量单位。如果我通过扫描检索它们,所有项目的总大小为 10KB,这将消耗 2 个读取容量单位。