Dynamodb Index

Overview

DynamoDB 支持两种二级索引:

  • Global secondary index (GSI): 其 hash key 和 range key 可以与基表上的 hash key 和 range key 不同的索引. 全局二级索引被视为 “全局”, 是因为对索引执行的查询可以跨基表中所有分区的所有数据. 本质上 GSI 就是一个另一个隐藏的 Table, 只不过会跟基表联动更新, 以获得更好的查询性能.

  • Local secondary index (GSI): hash key 与基表相同, 但 range key 不同的索引. local secondary index的含义是 “本地”, 表示 local secondary index 的每个分区的范围都将限定为具有相同 hash key 值的基表分区. 本质上 LSI 就是在同一个物理机器上的一个子 Index, 这和 SQL 中的 Index 比较像, 因为 LSI 的 partition key 和基表必须相同.

这里

  • R/W Capacity: 由于 GSI 本质上是另一个表, 你创建 GSI 的时候也要选择 Capacity, 跟 Table 一样可以是 On-demand 也可以是 Provisioned. (详情参考 DynamoDB Pricing) 你对 Table 本体的 Query 和对 GSI 的 Query 消耗的是不同的 Capacity, 不通用. 而 LSI 本质上是主表上为其他 Field 建立的索引, 跟主表共享 Capacity.

  • Restriction: LSI 必须在创建主表的同时创建. 主表被创建后就无法再创建 LSI 了. GSI 可以在创建主表后随时创建删除.

  • Limitation: 全表最多有 20 个 GSI, 5 个 LSI. 由于 LSI 是 Local 的, 每一个 Partition Key 对应的 LSI 数据不能超过 10GB (如果超过 10GB, 你的 Hash Key 的 cardinology 太低, 选择就有问题)

Global Secondary Indexes

Ref:

Local Secondary Indexes

Ref:

Best Practice