导读:本期聚焦于小伙伴创作的《DynamoDB稀疏全局二级索引是什么?如何实现按条件管理索引记录》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《DynamoDB稀疏全局二级索引是什么?如何实现按条件管理索引记录》有用,将其分享出去将是对创作者最好的鼓励。

DynamoDB作为AWS提供的全托管NoSQL数据库,支持全局二级索引(GSI)来扩展查询能力。稀疏全局二级索引是GSI的一种特殊使用形式,和传统GSI会为表中所有记录创建索引条目不同,它仅当记录包含GSI定义的分区键或排序键属性时,才会为这条记录生成索引条目,非常适合只需要对部分符合条件的记录做快速查询的场景。

DynamoDB稀疏全局二级索引是什么?如何实现按条件管理索引记录

稀疏全局二级索引的核心特性

传统GSI会为基表的所有条目创建索引,即使某些条目没有对应的索引键属性,DynamoDB也会为这些条目在索引中存储空值条目。而稀疏全局二级索引不会处理这类不包含索引键属性的记录,因此具备以下优势:

  • 减少索引存储空间占用,降低存储成本
  • 提升索引查询效率,因为索引中只包含需要查询的目标记录
  • 可以按照业务条件灵活筛选需要纳入索引的记录,实现按需索引管理

按条件管理索引记录的实现逻辑

要实现按条件管理索引记录,核心是在设计表结构时,只对需要纳入索引的记录添加对应的索引键属性。比如我们有一个用户订单表,需要快速查询所有已支付的订单,那么可以创建一个稀疏GSI,分区键设置为payment_status属性,只有当订单的支付状态为已支付时,才给该订单记录添加payment_status属性,这样GSI中就只会包含已支付的订单记录。

创建稀疏全局二级索引的示例

下面是使用AWS SDK for Python(Boto3)创建包含稀疏GSI的DynamoDB表的代码示例:

import boto3

# 创建DynamoDB资源
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')

# 创建用户订单表,同时创建稀疏GSI
table = dynamodb.create_table(
    TableName='user_orders',
    KeySchema=[
        {
            'AttributeName': 'order_id',
            'KeyType': 'HASH'  # 分区键
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'order_id',
            'AttributeType': 'S'
        },
        {
            'AttributeName': 'payment_status',
            'AttributeType': 'S'
        },
        {
            'AttributeName': 'order_time',
            'AttributeType': 'N'
        }
    ],
    GlobalSecondaryIndexes=[
        {
            'IndexName': 'paid_orders_index',
            'KeySchema': [
                {
                    'AttributeName': 'payment_status',
                    'KeyType': 'HASH'
                },
                {
                    'AttributeName': 'order_time',
                    'KeyType': 'RANGE'
                }
            ],
            'Projection': {
                'ProjectionType': 'ALL'
            },
            'ProvisionedThroughput': {
                'ReadCapacityUnits': 5,
                'WriteCapacityUnits': 5
            }
        }
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    }
)

print(f"表创建成功:{table.table_name}")

写入符合条件的记录

接下来我们写入两条订单记录,一条是已支付订单,一条是未支付订单,只有已支付订单会包含payment_status属性,从而被纳入稀疏GSI:

# 获取表对象
table = dynamodb.Table('user_orders')

# 写入已支付订单,包含payment_status属性,会被纳入稀疏GSI
table.put_item(
    Item={
        'order_id': 'order_001',
        'user_id': 'user_123',
        'order_amount': 299.9,
        'payment_status': 'paid',  # 包含GSI的分区键属性
        'order_time': 1698765432
    }
)

# 写入未支付订单,不包含payment_status属性,不会被纳入稀疏GSI
table.put_item(
    Item={
        'order_id': 'order_002',
        'user_id': 'user_123',
        'order_amount': 199.9,
        'order_time': 1698765433
        # 没有payment_status属性,不会进入稀疏GSI
    }
)

print("订单记录写入完成")

查询稀疏全局二级索引

查询稀疏GSI时,只需要指定索引名称和对应的键条件即可,因为索引中只包含已支付的订单,所以查询结果不会包含未支付订单:

# 查询所有已支付订单,按订单时间倒序排列
response = table.query(
    IndexName='paid_orders_index',
    KeyConditionExpression='payment_status = :status',
    ExpressionAttributeValues={
        ':status': 'paid'
    },
    ScanIndexForward=False  # 按排序键倒序
)

# 打印查询结果
print("已支付订单列表:")
for item in response['Items']:
    print(f"订单ID:{item['order_id']},金额:{item['order_amount']},下单时间:{item['order_time']}")

使用注意事项

在使用稀疏全局二级索引时,需要注意以下几点:

  • 稀疏GSI的索引键属性不是基表的必填属性,需要业务层控制何时添加该属性
  • 如果后续需要把某条记录纳入索引,只需要给该记录更新添加对应的索引键属性即可
  • 如果要把某条记录从索引中移除,可以删除该记录的索引键属性,DynamoDB会自动从GSI中删除对应的索引条目
  • 稀疏GSI同样支持投影配置,可以根据需要选择只投影部分属性到索引中,进一步减少存储开销
稀疏全局二级索引是DynamoDB优化索引存储和查询性能的重要手段,合理设计索引键属性的添加逻辑,就能实现灵活的按条件索引记录管理,适配各类按需查询的业务场景。

DynamoDB稀疏全局二级索引GSI条件索引管理修改时间:2026-06-15 16:03:16

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。