DynamoDB分区键与复合键访问效率对比及建模实现机制问询
业务场景与DynamoDB建模疑问解答
业务场景
- 模型包含多组属性,每个模型可通过
OrderId和Version唯一标识 - 每个
OrderId平均对应2-3个Version - 仅存在两种访问模式:
- 通过
OrderId+Version查询订单(实时操作) - 删除指定
OrderId下Version小于输入值的所有订单(定时任务,非实时)
- 通过
两种DynamoDB建模方案
- 以
OrderId为PartitionKey,Version为SortKey - 将
OrderId_Version拼接字符串作为唯一PartitionKey,不设置SortKey
注:假设两种方案的基数一致
疑问解答
方案1的GetItem定位逻辑
调用GetItem API时,DynamoDB先通过OrderId的哈希值确定存储分区。同一个PartitionKey下的所有数据会按照Version(SortKey)的顺序有序存储,确定分区后,会利用SortKey的有序性执行二分查找快速定位目标文档。因为SortKey是有序排列的,二分查找效率很高,完全能支撑实时查询的性能要求。
方案2的GetItem定位逻辑
方案2中每个项的PartitionKey(OrderId_Version拼接字符串)是全局唯一的。当通过哈希值找到对应分区后,DynamoDB会直接用这个唯一的PartitionKey值在分区内的哈希索引中精准匹配,直接命中目标文档,查找效率接近O(1)。
额外提一句:从你的业务需求来看,方案1更适配定时删除操作——可以直接用Query API指定OrderId,再加上Version < 输入值的条件批量获取待删除项;而方案2要实现这个删除,要么全表扫描,要么额外创建索引,效率会低不少。
内容的提问来源于stack exchange,提问作者Zeeshan Shamsuddeen
相关产品推荐
相关产品推荐

