DynamoDB 支持二级索引吗?
支持。DynamoDB 支持两种二级索引。全局二级索引(GSI)有自己的分区键/排序键和容量(默认每张表 20 个,只支持最终一致性)。本地二级索引(LSI)与表共用分区键、使用不同的排序键,支持强一致性,并且必须在建表时定义。
全局二级索引(GSI)
- 有自己的分区键和排序键,独立于表的键。
- 有自己的预置吞吐量(或按需容量)。
- 只支持最终一致性读取。
- 随时可增可删;默认配额是每张表 20 个。
GSI 是你按表主键之外的属性查找项的方式。
本地二级索引(LSI)
- 与表共用分区键,但用不同的排序键。
- 与表共用吞吐量。
- 支持强一致性读取。
- 必须在建表时创建,之后无法添加。
两个可以测量出来的差别
GSI 的读取不会在你要求强一致性时悄悄降级。它会失败:
ValidationException: Consistent reads are not supported on global secondary indexes
HTTP 400同一个带 ConsistentRead: true 的查询打到 LSI 上会成功,并报告 ConsumedCapacity 1.0,而同一个项的最终一致性读取报告的是 0.5。强一致性在 LSI 上是可用的,代价是两倍的读单元。
第二个差别在写入上,而且它是会体现在账单上的那一个。把同一个 920 字节的项写进三张只在 GSI 数量上不同的表:
0 GSIs ConsumedCapacity 1 table 1
1 GSI ConsumedCapacity 2 table 1, gsi1 1
2 GSIs ConsumedCapacity 3 table 1, gsi1 1, gsi2 1每一个投影了被改动属性的 GSI,都是你要付钱的又一次写入。AWS 把这些数字背后的规则写了出来:写入成本是 "the sum of write capacity units consumed by writing to the base table and those consumed by updating the global secondary indexes"。KEYS_ONLY 投影就是你把第二次写入压小的办法。
怎么在两者之间选
新的访问模式和灵活性用 GSI;当你需要在同一个分区内按另一种排序做强一致读取时,用 LSI。
深入了解
在 GSI 与 LSI 对比里比较它们,并阅读索引投影。下载 DynoTable 来通过你的索引做查询。
参考资料
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Local secondary indexes — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档;配额于 2026-07-28 重新核对。
错误字符串和那些 ConsumedCapacity 值是 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 捕获的,都是引擎自己的输出。