如何通过DynamoDB全局二级索引与属性表达式降低读取成本?
关于DynamoDB GSI读取成本与优化方案的解答
带属性表达式的GSI能否降低读取成本?
明确说:能降低读取成本。
DynamoDB的全局二级索引(GSI)是独立的数据集,只包含你创建GSI时指定的投影属性,而非主表的完整行。当你查询GSI并使用属性表达式过滤返回字段时,DynamoDB读取的是GSI里的条目,不是主表的整行数据。
读取容量单位(RCU)是按实际读取的数据大小计算的:强一致性读取下,每4KB数据消耗1个RCU;最终一致性读取下,每8KB消耗1个RCU。如果GSI的单条条目大小远小于主表行的大小,查询GSI的RCU消耗自然比查主表低,直接降低读取成本。
这里要区分两个点:
- GSI的投影属性:这是控制读取数据量的核心,决定了GSI里存储哪些属性
- 查询时的属性表达式:只是在GSI已存储的数据里过滤返回给你的字段,不会改变实际读取的数据量,也就不影响RCU消耗
所以只要你创建GSI时只投影查询需要的属性子集,不管用不用属性表达式,读取成本都会比查主表低。
其他读取成本优化方案(除分表外)
如果要进一步优化读取成本,还可以试试这些方案:
- 切换到按需容量模式:适合流量波动大的场景,只按实际使用的RCU/SCU付费,避免预置容量的浪费
- 用DAX缓存热点数据:DynamoDB Accelerator是全托管内存缓存,能大幅减少重复查询的读取成本,同时提升性能
- 压缩属性值:对大文本、JSON这类数据做压缩(比如GZIP),减小单条数据的大小,从而降低每读取一条数据消耗的RCU
- 批量读取操作:用
BatchGetItemAPI一次性读取多条数据,减少API调用次数,提升效率的同时间接降低成本 - 优化查询/扫描逻辑:尽量用查询(Query)代替扫描(Scan),因为查询是基于主键/GSI键的定向读取,避免全表扫描带来的大量RCU消耗;如果必须用扫描,加过滤条件减少返回的数据量(注意:过滤是读取后过滤,不减少RCU,但能降低数据传输和后续处理成本)
- 利用TTL清理过期数据:给不需要长期保留的数据设置生存时间(TTL),自动清理过期条目,减少需要扫描或查询的数据量
- 选合适的一致性级别:如果业务允许,优先用最终一致性读取,它的RCU消耗是强一致性的一半(8KB对应1个RCU)
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

