AWS DynamoDB如何查询所有sort key为post的全量数据
DynamoDB 获取所有sort key为"post"数据的实现方案
推荐方案:使用全局二级索引(GSI)
直接对原表做全表扫描效率极低,用GSI可以实现高效查询,操作步骤如下:
步骤1:创建GSI
在你的DynamoDB表中新增一个全局二级索引,配置规则:
- GSI的分区键设置为原表的排序键字段(通常单表设计中该字段命名为
SK,也就是你存储"post"值的字段) - GSI的排序键可按需选择,比如需要按帖子发布时间排序就选
create_time字段,无特殊排序需求用原表的分区键(通常为PK)即可 - 投影属性按需配置:只需要帖子的部分字段就选「指定属性」,需要全量字段就选「全部」
创建完成后等待DynamoDB完成索引数据回填即可使用。
步骤2:查询GSI获取全量帖子
直接对该GSI发起Query请求即可,无需遍历全表:
- 查询条件设置为
GSI分区键 = "post" - 数据量较大需要翻页时,用返回的
LastEvaluatedKey作为后续请求的ExclusiveStartKey做分页查询即可
以下是Python boto3的示例代码:
import boto3 from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的表名') posts = [] # 首次查询 response = table.query( IndexName='你创建的GSI的名称', KeyConditionExpression=Key('SK').eq('post') ) posts.extend(response['Items']) # 分页拉取剩余数据 while 'LastEvaluatedKey' in response: response = table.query( IndexName='你创建的GSI的名称', KeyConditionExpression=Key('SK').eq('post'), ExclusiveStartKey=response['LastEvaluatedKey'] ) posts.extend(response['Items'])
临时小数据量可选方案:全表扫描
如果你的表总数据量极小(千条以内),仅做临时查询,也可以直接扫原表实现,生产环境禁止使用该方案:
response = table.scan( FilterExpression=Key('SK').eq('post') ) posts = response['Items']
注意:
Scan操作会遍历全表所有数据,哪怕符合条件的条目很少,也会消耗和全表数据量匹配的读容量,数据量大时成本极高、响应延迟极长。
内容的提问来源于stack exchange,提问作者plutolaser
相关产品推荐
相关产品推荐

