如何在PartiQL中查询DynamoDB每个主分区键对应的最新数据
DynamoDB 按分区键获取最新记录实现方案
你的表结构为 account_id(主分区键)、record_id(主排序键,排序键值越大对应记录越新),要获取每个account_id对应的最新记录,可根据你的业务场景选择以下方案:
方案1:单分区定向查询(推荐,适合分区键总量可控的场景)
如果你的账户总数可控,可遍历所有account_id分别发起查询,单次查询逻辑如下:
- 指定查询条件为匹配对应
account_id - 设置查询结果按排序键降序返回
- 限制返回结果数量为1
这种方式完全命中DynamoDB索引,不需要扫描冗余数据,读容量消耗极低,查询延迟在毫秒级。
Python boto3 实现示例:
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的账户统计表名') # 替换为你所有的account_id列表 all_account_ids = [1, 2, 3] latest_records = [] for aid in all_account_ids: resp = table.query( KeyConditionExpression=Key('account_id').eq(aid), # 按排序键降序,最新的记录排在第一位 ScanIndexForward=False, # 只返回第一条最新记录 Limit=1 ) if resp.get('Items'): latest_records.append(resp['Items'][0])
方案2:新增最新记录镜像表(推荐,适合分区键量大、高频查询的生产场景)
如果你的账户量级很大,或者需要频繁拉取全量账户的最新记录做报表,可以新增一张结构完全相同的账户最新统计表,主键同样为account_id:
- 每次写入原表的统计数据时,同步覆盖写入
账户最新统计表中对应account_id的记录 - 后续需要拉取全量最新记录时,直接扫描这张镜像表即可,不需要任何额外过滤逻辑
这种方案会增加少量写入成本,但查询成本极低,非常适合报表生成这类批量查询场景。
方案3:全表扫描后客户端过滤(不推荐,仅适合测试小表场景)
如果你的表总数据量极小,也可以直接全表扫描,在客户端自行保留每个account_id对应的最大record_id记录即可。但这种方式需要扫描全表所有数据,数据量大时会消耗极高的读容量,查询延迟也无法保证,生产环境不建议使用。
内容的提问来源于stack exchange,提问作者lowLatency
相关产品推荐
相关产品推荐

