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

DynamoDB全局查询:如何获取表中最新添加的10条数据

我有一个名为posts的表,其主键按唯一的id字段进行分区。现在我需要获取数据库中最新推送的10条帖子。我有一个timestamp列,但使用带“虚拟分区”的GSI对所有对象的timestamp进行排序,会随着行数增加而变慢。是否有办法直接获取数据库中最新添加的X条数据?

高效获取最新X条帖子的解决方案

方案1:重构主键为复合结构(最优性能)

如果可以调整表结构,将主键改为复合主键:

  • 分区键使用固定聚合值(比如latest_posts),把所有需要排序的帖子归入同一分区
  • 排序键采用timestamp(或反向时间戳9999999999 - timestamp,让最新数据排在最前面)

查询最新10条时,直接执行定向查询(以DynamoDB为例):

# 伪代码示例
response = dynamodb.query(
    TableName='posts',
    KeyConditionExpression='#pk = :val',
    ExpressionAttributeNames={'#pk': 'partition_key'},
    ExpressionAttributeValues={':val': 'latest_posts'},
    ScanIndexForward=False,  # 倒序获取最新数据
    Limit=10
)

这种方式性能稳定,不会随数据量增长下降,因为查询直接定位目标分区,按排序键快速返回结果。若帖子量极大(单分区超过10GB或QPS超1000),可将分区键改为时间分片(如latest_posts_20240520),查询时依次扫描最近的分片合并结果即可。

方案2:利用id的时序特性(无需改表)

如果你的id是时间相关的递增/递减值(如雪花ID、UUID v1、自增ID),可直接通过id倒序获取最新数据:

  • 若支持主键排序,执行查询时设置倒序并限制条数;若只能全表扫描,可记录当前最大id,后续仅查询id > 最大id的项,缩小扫描范围。

注意:纯全表扫描在数据量较大时性能仍会下降,此方案仅适用于数据量不大或id时序性极强的场景。

方案3:优化现有GSI设计

若无法调整主表结构,优化原GSI的分区策略:

  • 替换“虚拟分区”为时间分片分区键,比如按小时生成分片值(ts_shard_2024052014),每个分片内用timestamp作为排序键
  • 查询最新数据时,先扫描当前时间所在分片,取满X条则停止;若数量不足,依次扫描上一个时间分片,直至凑够条数
  • 给GSI设置TTL规则,自动清理旧分片数据,避免GSI数据量持续膨胀

方案4:维护聚合缓存表

定期(如每分钟)将最新的N条帖子同步到一个专门的聚合表(如latest_posts_cache),查询时直接从该表读取。此方案适合对实时性要求不高的场景,能保证查询性能始终稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:08:35