DynamoDB LIMIT参数机制及汇率查询方案相关疑问
DynamoDB汇率查询与存储方案答疑
一、Query参数机制疑问解答
1. 无过滤表达式时,能否返回最新记录?RCU消耗是否高效?
可以稳定返回最新记录。你的表结构以货币对为分区键、时间戳为排序键,--no-scan-index-forward参数会让DynamoDB按排序键倒序(从最大时间戳到最小)读取数据,配合--limit 1会直接取排序最靠前的第一条数据,也就是最新的汇率记录。
RCU消耗是高效的:Query操作只会读取满足条件的前N条(这里N=1),不会扫描整个分区。你测试的20万条记录下仅消耗0.5 RCU是正常情况——DynamoDB的RCU以4KB为单位计算,单条汇率数据通常远小于4KB,最终一致读的话只读1条就是0.5 RCU,强一致读则是1 RCU。
2. 添加过滤表达式后,能否返回符合条件的最新记录?
不能保证。DynamoDB的过滤表达式是在Query获取到数据之后才执行的,而--limit参数在过滤之前就生效了。比如:如果倒序读取的第1条数据不符合过滤条件,--limit 1会直接终止查询,不会继续读取下一条,最终返回空结果,而非符合条件的最新记录。
如果需要获取符合过滤条件的最新记录,建议把过滤字段加入全局二级索引(GSI)的键中,通过GSI进行Query,先按过滤条件筛选分区再倒序取最新;或者去掉--limit,先倒序读取整个分区数据再过滤(但这种方式效率低,不推荐)。
3. 指定limit为5时,DynamoDB如何选择要处理的5条记录?
是基于排序键的顺序选择的。开启--no-scan-index-forward后,DynamoDB会从排序键最大的记录(最新的)开始,连续读取5条记录,之后再应用过滤表达式(如果有)。也就是说,这5条是分区内排序键最靠前的5条,和其他字段无关。
二、两种存储方案优劣对比
方案1:仅插入新记录
- 优势:
- 写入逻辑极简:每次有新汇率时,直接执行
PutItem插入新记录,无需额外判断或操作。 - 历史数据天然留存:所有汇率历史都存在表中,查询历史汇率只需按时间范围Query即可。
- 单条写入WCU消耗低:每次PutItem仅消耗1 WCU(数据小于1KB时)。
- 写入逻辑极简:每次有新汇率时,直接执行
- 劣势:
- 查询最新记录需要执行倒序Query:虽然效率已经很高,但比直接GetItem多了一点逻辑步骤。
方案2:版本化插入/更新(V0存最新值)
- 优势:
- 查询最新记录更便捷:直接通过
GetItem(货币对+固定排序键如"V0")就能获取最新汇率,无需排序或Query操作。
- 查询最新记录更便捷:直接通过
- 劣势:
- 写入逻辑复杂:每次新汇率需要执行两个操作——插入新版本记录(如"V123"),同时更新"V0"记录的汇率值;如果要保证一致性,还需要用事务操作,进一步增加复杂度。
- WCU消耗更高:两次写入操作(PutItem+UpdateItem)会消耗约2倍的WCU(数据小于1KB时),即使使用事务,WCU消耗也不会减少。
内容的提问来源于stack exchange,提问作者mysteryFruit
相关产品推荐
相关产品推荐

