Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

DynamoDB 中二级索引的一般准则

Amazon DynamoDB 支持两种类型的二级索引:

  • 全局二级索引—分区键和排序键可与基表中的这些键不同的索引。全局二级索引之所以称为“全局”,这是因为该索引上的查询可跨过所有分区,涵盖基表中的所有数据。全局二级索引没有大小限制且具有其自己的读取和写入活动的预配置吞吐量设置,这些设置独立于表的相应设置。

  • 本地二级索引—分区键与基表相同但排序键不同的索引。本地二级索引之所以称为“本地”,是因为该索引的每个分区的范围都限定为具有相同分区键值的基表分区。因此,对于任何一个分区键值,索引项目的大小总和不得超过 10GB。此外,本地二级索引与其索引的表共享用于读取和写入活动的预配置吞吐量设置。

DynamoDB 中的每个表限制为最多 5 个全局二级索引和 5 个本地二级索引。对于全局二级索引,这要比其可能显示的限制性更低,因为您可以使用一个全局二级索引通过重载它(有关更多信息,请参阅重载全局二级索引)来满足多种应用程序访问模式。

有关全局二级索引与本地二级索引之间的区别的更多信息,请参阅使用二级索引改进数据访问

一般来说,应使用全局二级索引而不是本地二级索引。例外情况是当您在查询结果中需要强一致性时,在这种情况下,本地二级索引可提供强一致性但全局二级索引无法提供 (全局二级索引查询仅支持最终一致性)。

以下是在 DynamoDB 中创建索引时要记住的一些一般原则和设计模式:

高效使用索引

  • 最大程度地减少索引的数量。 请勿对不常查询的属性创建二级索引。很少使用的索引会增加存储和 I/O 成本,而且无法提高应用程序性能。

  • 对于写入活动工作量很大的表,避免使用索引。 例如,在数据捕获应用程序中,要在具有极高写入负载的表上维护索引所需的 I/O 操作,成本非常高。如果您需要为此类表中的数据编制索引,可能更有效的方法是将数据复制到具有必要索引的另外一个表,并对其进行查询。

慎重选择投影

由于二级索引会占用存储空间和预配置吞吐量,因此您应尽可能地减少索引的大小。此外,相较于查询整个表,索引越小,性能优势越明显。如果您的查询通常只返回很少一部分属性,并且这些属性的总和远远少于整个项目的大小,那么您应当只投影经常请求的属性。

如果您预期表中会有大量写入活动 (相较于读取),请遵循以下最佳实践:

  • 请尽量减少投影属性的数量,以最大程度减少写入索引的项目大小。但是,这仅在投影属性的大小大于单个写入容量单位 (1 KB) 时适用。例如,如果索引条目的大小仅为 200 字节,则 DynamoDB 会将其向上取整为 1 KB。也就是说,如果索引项目很小的话,您可以投影更多属性,而不会额外增加成本。

  • 避免投影您知道在查询中极少需要的属性。每次您更新在索引中投影的属性时,也会因更新索引而额外产生成本。您仍可以较高的预配置吞吐量成本检索 Query 中的未投影属性,但查询成本要明显低于频繁更新索引的成本。

  • 只有当您需要让查询返回按不同的排序键排序的整个表项目时,才应指定 ALL。投影所有属性后就不会再需要表抓取,但在大多数情况下,这样会使得存储和写入活动成本加倍。

平衡尽可能地减少索引的大小的需求与最大程度地减少抓取操作的需求,如下一部分中所述。

优化频繁查询以避免抓取

要在延迟尽可能低的前提下以最快速度完成查询,您可以投影自己认为查询应当会返回的所有属性。具体而言,如果您对未查询的属性查询本地二级索引,DynamoDB 会自动从表中抓取这些属性,这需要从表中读取整个项目。这将引入您可避免的延迟和其他 I/O 操作。

请记住,这些“偶然”查询经常会转变成“必要”查询。如果有您不打算投影的属性,因为您预计只是会偶尔对这些属性执行查询,请考虑是否情况可能发生更改而且您可能后悔未投影这些属性。

有关表抓取的更多信息,请参阅本地二级索引 的预置吞吐量注意事项

创建本地二级索引时注意项目集合大小限制

项目集合 是指表中的所有项目及其具有相同分区键的本地二级索引。项目集合不能超过 10GB,因此特定的分区键值可能会出现空间不足的情况。

当您添加或更新表项目时,DynamoDB 会更新受影响的所有本地二级索引。如果表中定义了索引属性,那么本地二级索引也会扩展。

当您创建本地二级索引时,请考虑要向其中写入的数据量,以及有多少数据项目具有相同的分区键值。如果您预计特定分区键值的表和索引项目之和可能会超过 10GB,请考虑是否应避免创建该索引。

如果不能避免创建此本地二级索引,则您必须预计项目集合大小限制,并在超过该限制之前采取措施。有关在限制范围内操作以及采取纠正措施的策略,请参阅项目集合大小限制