

# 利用稀疏索引
<a name="bp-indexes-general-sparse-indexes"></a>

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

稀疏索引对于查询表的小子集非常有用。例如，假设有一个表存储所有客户订单，具有以下键属性：
+ 分区键：`CustomerId`
+ 排序键：`OrderId`

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

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

## DynamoDB 中稀疏索引的示例
<a name="bp-indexes-sparse-examples"></a>

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

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

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

![\[稀疏 GSI 示例。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/SparseIndex_A.png)


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

![\[稀疏 GSI 示例。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/SparseIndex_B.png)


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