无需Scan操作在DynamoDB中获取最新10条产品记录的方案
解决DynamoDB高效获取最新10个产品的方案
你的核心需求是在大流量、大数据量的电商场景下,避开Scan操作,高效获取按createTimestamp排序的最新10个产品。之前考虑的常量作为GSI主键确实是反模式——所有数据会挤在同一个GSI分区里,触发热点问题,导致吞吐量受限,完全不适合高频访问场景。下面给出几个更优的替代方案:
方案1:时间分片GSI(最通用方案)
把时间维度拆分成分区键,让数据分散到多个GSI分区,同时保留createTimestamp作为排序键实现排序。
具体实现:
- 创建GSI:
- 分区键设为
timePartition(粒度根据产品写入频率调整:比如按小时生成YYYY-MM-DD-HH,或按天生成YYYY-MM-DD) - 排序键设为
createTimestamp,并设置GSI的排序规则为降序
- 分区键设为
- 写入数据时:
- 计算当前产品对应的
timePartition值,和其他属性一起存入主表
- 计算当前产品对应的
- 查询最新10个产品:
- 先获取当前的
timePartition值,执行Query操作:# 示例Python代码 response = dynamodb.query( TableName='your-table-name', IndexName='timePartition-createTimestamp-index', KeyConditionExpression='timePartition = :current_partition', ExpressionAttributeValues={':current_partition': '2024-05-20-14'}, ScanIndexForward=False, # 降序排列,最新数据在前 Limit=10 ) items = response['Items'] - 如果返回结果不足10条,依次查询前一个时间分片(比如
2024-05-20-13),直到凑够10条或无更多数据
- 先获取当前的
优势:
- 彻底避免GSI热点,数据均匀分布在多个分区
- 支持任意时间范围的最新数据查询,灵活性高
- Query操作性能远优于Scan,适配高频访问场景
方案2:稀疏索引+时间窗口(适合仅关注近期数据的场景)
如果业务只需要获取最近N小时/天的最新产品(比如仅展示24小时内的新品),可以用稀疏GSI方案:
具体实现:
- 创建GSI:
- 分区键设为
recentProduct,排序键为createTimestamp(降序)
- 分区键设为
- 写入/更新数据时:
- 刚创建的产品设置
recentProduct = 'YES';当产品超过设定的时间窗口(如24小时),将recentProduct设为NULL(DynamoDB会自动从GSI中移除该条目)
- 刚创建的产品设置
- 查询时:
- 直接Query该GSI:
response = dynamodb.query( TableName='your-table-name', IndexName='recentProduct-createTimestamp-index', KeyConditionExpression='recentProduct = :flag', ExpressionAttributeValues={':flag': 'YES'}, ScanIndexForward=False, Limit=10 )
- 直接Query该GSI:
优势:
- GSI数据量极小,查询速度极快
- 实现简单,无需处理多分片查询逻辑
- 自动清理旧数据,GSI不会无限制膨胀
方案3:维护单独的「最新产品表」(适合固定数量最新数据的场景)
如果需求就是固定获取最新10个产品,可以专门建一个小表来维护这10条数据:
具体实现:
- 创建小表:
- 主键设为
type(固定值如latestProducts),排序键设为createTimestamp(降序)
- 主键设为
- 写入新产品时:
- 使用DynamoDB事务API,同时完成两个操作:
- 将新产品写入主表
- 将新产品写入小表,随后查询小表所有数据,若数量超过10条,删除最旧的条目(即
createTimestamp最小的记录)
- 使用DynamoDB事务API,同时完成两个操作:
- 查询时:
- 直接Query该小表,取前10条即可,性能拉满
优势:
- 查询为单分区Query,延迟极低,完全适配高频访问
- 逻辑直观,无需处理复杂的分片逻辑
注意点:
- 必须用事务保证主表和小表操作的原子性,避免数据不一致
- 小表数据量固定为10条,存储和查询成本可忽略
方案选择建议:
- 需要支持任意时间范围的最新数据查询 → 选时间分片GSI
- 仅关注近期(如24小时内)新品 → 选稀疏索引+时间窗口
- 仅需固定数量的最新产品 → 选单独维护最新产品表
内容的提问来源于stack exchange,提问作者tan
相关产品推荐
相关产品推荐

