PynamoDB高级特性揭秘:全局二级索引与本地二级索引

张开发
2026/4/11 15:11:19 15 分钟阅读

分享文章

PynamoDB高级特性揭秘:全局二级索引与本地二级索引
PynamoDB高级特性揭秘全局二级索引与本地二级索引【免费下载链接】PynamoDBA pythonic interface to Amazons DynamoDB项目地址: https://gitcode.com/gh_mirrors/py/PynamoDBPynamoDB作为一款Python风格的Amazon DynamoDB接口提供了强大的索引功能来优化数据查询效率。全局二级索引GSI和本地二级索引LSI是DynamoDB中两种关键的索引类型它们能够帮助开发者实现更灵活、高效的数据访问模式。本文将深入解析这两种索引的实现方式、使用场景及最佳实践让你轻松掌握PynamoDB索引的高级应用技巧。全局二级索引GSI突破表主键限制的灵活查询全局二级索引是独立于表主键的索引结构允许你使用与表主键不同的属性作为索引的哈希键和排序键。这使得你可以按新的维度组织和查询数据极大地扩展了数据访问的灵活性。快速创建全局二级索引在PynamoDB中定义全局二级索引非常简单只需创建一个继承自GlobalSecondaryIndex的类并在其中指定索引的键和投影设置from pynamodb.indexes import GlobalSecondaryIndex, AllProjection from pynamodb.attributes import NumberAttribute class ViewIndex(GlobalSecondaryIndex): 全局二级索引示例 class Meta: index_name viewIdx # 索引名称 read_capacity_units 1 # 读取容量单位 write_capacity_units 1 # 写入容量单位 projection AllProjection() # 投影所有属性 view NumberAttribute(default0, hash_keyTrue) # 索引哈希键然后将这个索引添加到你的模型类中from pynamodb.models import Model from pynamodb.attributes import UnicodeAttribute class TestModel(Model): 使用全局二级索引的模型示例 class Meta: table_name TestModel host http://localhost:8000 # DynamoDB本地端点 forum UnicodeAttribute(hash_keyTrue) # 表哈希键 thread UnicodeAttribute(range_keyTrue) # 表排序键 view_index ViewIndex() # 关联全局二级索引 view NumberAttribute(default0) # 索引属性高效查询全局二级索引创建索引后你可以像查询表一样查询索引语法简洁直观# 使用全局二级索引查询 for item in TestModel.view_index.query(1): print(f从索引查询到的项目: {item})全局二级索引特别适合需要按非主键属性进行查询的场景例如按查看次数查询热门帖子或按用户ID查询用户发布的所有内容。本地二级索引LSI基于表主键的扩展查询能力本地二级索引与全局二级索引的主要区别在于它必须使用与表相同的哈希键但可以使用不同的排序键。这使得你可以在相同的哈希键下按不同的排序维度组织数据。本地二级索引的定义与使用定义本地二级索引与全局二级索引类似只需继承LocalSecondaryIndex类from pynamodb.indexes import LocalSecondaryIndex, AllProjection class GamePlayerOpponentIndex(LocalSecondaryIndex): 本地二级索引示例 class Meta: read_capacity_units 1 write_capacity_units 1 projection AllProjection() player_id UnicodeAttribute(hash_keyTrue) # 与表相同的哈希键 winner_id UnicodeAttribute(range_keyTrue) # 不同的排序键本地二级索引的查询方式也与全局索引类似# 使用本地二级索引查询 for item in GameModel.player_opponent_index.query(1234): print(f从本地索引查询到的项目: {item})全局二级索引 vs 本地二级索引关键差异与选择指南特性全局二级索引GSI本地二级索引LSI哈希键可以与表不同必须与表相同容量模式独立设置继承表的设置创建时机表创建后可添加/修改只能在表创建时定义数量限制每个表最多20个每个表最多5个选择建议当需要按与表主键完全不同的维度查询时选择GSI当需要在相同哈希键下按不同排序方式查询时选择LSI考虑查询模式的稳定性LSI创建后无法修改而GSI可以随时添加或修改索引投影策略平衡性能与存储成本PynamoDB提供了三种索引投影策略允许你控制哪些属性被复制到索引中AllProjection投影所有属性查询时无需回表但存储成本最高KeysOnlyProjection只投影键属性存储成本最低但可能需要回表查询IncludeProjection投影键属性和指定的非键属性平衡性能与成本选择合适的投影策略可以显著影响查询性能和存储成本。例如对于频繁访问的属性使用AllProjection可以避免回表查询提高性能。索引最佳实践与性能优化合理设置读写容量GSI有独立的容量设置应根据查询量合理配置控制索引数量过多的索引会增加写入开销和存储成本谨慎选择投影属性只投影必要的属性减少存储开销利用索引进行排序通过索引的排序键实现高效的排序查询分页处理大量结果使用last_evaluated_key处理大型结果集# 分页查询示例 def iterate_over_page(last_evaluated_keyNone): results TestModel.view_index.query( foo, TestModel.view 0, limit10, last_evaluated_keylast_evaluated_key ) for item in results: # 处理项目 pass return results.last_evaluated_key通过合理使用全局二级索引和本地二级索引你可以充分发挥DynamoDB的性能优势构建高效、灵活的数据访问模式。PynamoDB提供的简洁API让索引的定义和使用变得轻松直观无论是简单查询还是复杂的数据访问模式都能游刃有余。要深入了解更多关于PynamoDB索引的信息可以参考官方文档docs/indexes.rst或查看完整的示例代码examples/indexes.py。【免费下载链接】PynamoDBA pythonic interface to Amazons DynamoDB项目地址: https://gitcode.com/gh_mirrors/py/PynamoDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章