You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Scan操作在DynamoDB中获取最新10条产品记录的方案

解决DynamoDB高效获取最新10个产品的方案

你的核心需求是在大流量、大数据量的电商场景下,避开Scan操作,高效获取按createTimestamp排序的最新10个产品。之前考虑的常量作为GSI主键确实是反模式——所有数据会挤在同一个GSI分区里,触发热点问题,导致吞吐量受限,完全不适合高频访问场景。下面给出几个更优的替代方案:

方案1:时间分片GSI(最通用方案)

把时间维度拆分成分区键,让数据分散到多个GSI分区,同时保留createTimestamp作为排序键实现排序。

具体实现:

  1. 创建GSI:
    • 分区键设为timePartition(粒度根据产品写入频率调整:比如按小时生成YYYY-MM-DD-HH,或按天生成YYYY-MM-DD)
    • 排序键设为createTimestamp,并设置GSI的排序规则为降序
  2. 写入数据时:
    • 计算当前产品对应的timePartition值,和其他属性一起存入主表
  3. 查询最新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方案:

具体实现:

  1. 创建GSI:
    • 分区键设为recentProduct,排序键为createTimestamp(降序)
  2. 写入/更新数据时:
    • 刚创建的产品设置recentProduct = 'YES';当产品超过设定的时间窗口(如24小时),将recentProduct设为NULL(DynamoDB会自动从GSI中移除该条目)
  3. 查询时:
    • 直接Query该GSI:
      response = dynamodb.query(
          TableName='your-table-name',
          IndexName='recentProduct-createTimestamp-index',
          KeyConditionExpression='recentProduct = :flag',
          ExpressionAttributeValues={':flag': 'YES'},
          ScanIndexForward=False,
          Limit=10
      )
      

优势:

  • GSI数据量极小,查询速度极快
  • 实现简单,无需处理多分片查询逻辑
  • 自动清理旧数据,GSI不会无限制膨胀

方案3:维护单独的「最新产品表」(适合固定数量最新数据的场景)

如果需求就是固定获取最新10个产品,可以专门建一个小表来维护这10条数据:

具体实现:

  1. 创建小表:
    • 主键设为type(固定值如latestProducts),排序键设为createTimestamp(降序)
  2. 写入新产品时:
    • 使用DynamoDB事务API,同时完成两个操作:
      1. 将新产品写入主表
      2. 将新产品写入小表,随后查询小表所有数据,若数量超过10条,删除最旧的条目(即createTimestamp最小的记录)
  3. 查询时:
    • 直接Query该小表,取前10条即可,性能拉满

优势:

  • 查询为单分区Query,延迟极低,完全适配高频访问
  • 逻辑直观,无需处理复杂的分片逻辑

注意点:

  • 必须用事务保证主表和小表操作的原子性,避免数据不一致
  • 小表数据量固定为10条,存储和查询成本可忽略

方案选择建议:

  • 需要支持任意时间范围的最新数据查询 → 选时间分片GSI
  • 仅关注近期(如24小时内)新品 → 选稀疏索引+时间窗口
  • 仅需固定数量的最新产品 → 选单独维护最新产品表

内容的提问来源于stack exchange,提问作者tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:15:38