View a markdown version of this page

利用稀疏索引 - Amazon DynamoDB

利用稀疏索引

对于表中的任何项目,仅当项目中存在索引键属性时,DynamoDB 才会写入相应的索引条目。对于全局二级索引,这意味着必须在项目上定义索引分区键,如果索引还有排序键,则该属性也必须存在。如果某个项目中缺少任何一个关键属性,则该项目不会出现在索引中。仅有基表中一部分项目的索引称为稀疏索引。

稀疏索引对于查询表的小子集非常有用。例如,假设有一个表存储所有客户订单,具有以下键属性:

  • 分区键:CustomerId

  • 排序键:OrderId

要跟踪未结订单,可以在尚未发货的订单项目中插入一个名为 isOpen 的属性。订单发货后,可以删除该属性。如果对 CustomerId(分区键)和 isOpen(排序键)创建索引,则仅显示定义了 isOpen 的订单。如果数以千计的订单中只有少量订单处于未结状态,查询未结订单索引比扫描整个表更快,成本更低。

可以使用值在索引中生成有用排序顺序的属性,代替 isOpen 属性。例如,可以使用设置为下每个订单的日期的 OrderOpenDate 属性,订单完成后删除。这样查询稀疏索引时,返回的项目将按下每个订单的日期排序。

DynamoDB 中稀疏索引的示例

全局二级索引默认属于稀疏型。创建全局二级索引时,指定一个分区键,可以选择指定一个排序键。在基表中,只有包含所要求关键属性的项目才会显示在索引中。如果某个项目缺少索引分区键(或已定义的排序键),则将在索引中排除该项目。

将全局二级索引设计为稀疏索引,可以配置低于基表的写入吞吐量,同时仍实现出色的性能。

例如,游戏应用程序可能跟踪每个用户的所有得分,但通常只需查询一些高分。下面的设计高效处理这种情况:

稀疏 GSI 示例。

Rick 玩三款游戏,在其中一款游戏中达到 Champ 状态。Padma 玩四款游戏,在其中两款游戏中达到 Champ 状态。请注意,只有用户达到奖励的项目存在 Award 属性。关联全局二级索引如下所示:

稀疏 GSI 示例。

全局二级索引仅包含经常查询的高分,这是基表的一个小子集。