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 来通过你的索引做查询。

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档;配额于 2026-07-28 重新核对。

错误字符串和那些 ConsumedCapacity 值是 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 捕获的,都是引擎自己的输出。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。