我正在尝试在 DynamoDB 中实现单个表设计,并且我看到了使用分区键前缀来识别实体的建议。例如,汽车的记录可能具有格式为 CAR#
使用这样的静态前缀会导致热分区吗?具体来说,如果我有大量记录(例如 500k 辆汽车),所有带有前缀 CAR# 的记录是否都会出现在同一个分区中,从而可能影响性能?
此外,如果我使用实体类型作为分区键创建全局二级索引 (GSI),此设置是否还会在该 GSI 上创建热分区?在不执行扫描操作的情况下获取特定实体的所有记录的一个好的替代方案是什么?
我担心对分区键使用一致的前缀(如 CAR#)可能会导致扩展时出现热分区。如果有任何关于避免此问题的最佳实践的见解或建议,我将不胜感激,特别是在 GSI 方面。
PK | SK(实体) | 属性 |
---|---|---|
车#12345 | 汽车 | 车12345记录 |
车#67890 | 汽车 | 车67890记录 |
车#11111 | 汽车 | 车11111的记录 |
卡车#22222 | 卡车 | 卡车22222的记录 |
GSI PK | GSI SK | 描述 |
---|---|---|
汽车 | 车#12345 | 12345型车GSI记录 |
卡车 | 卡车#22222 | 22222 型卡车的 GSI 记录 |
虽然 car#guid 不会导致热分区,但
car
上的索引可能会导致热分区。 DynamoDB 上的每个分区可以处理 1000 WCU 和 3000 WCU。
如果您的索引需要更多容量,您可以选择对类别类型进行分片,例如,
CAR#1
,CAR#2
等...为每个类别分配一个0-N之间的随机数。
N 是由您期望的每个类别/1000 的吞吐量定义的。