Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

管理全局二级索引

本部分介绍如何创建、修改和删除全局二级索引。

创建包含全局二级索引的表

要创建包含一个或多个全局二级索引的表,请将 CreateTable 操作与 GlobalSecondaryIndexes 参数配合使用。为获得最高的查询灵活性,可以为每个表创建最多 5 个全局二级索引。

您必须为索引分区键指定一个属性;您可以选择为索引排序键指定其他属性。这些键属性中任意一个都无需与表中的键属性相同。例如,在 GameScores 表 (请参阅全局二级索引) 中,TopScoreTopScoreDateTime 都不是键属性;您可以创建一个带分区键 TopScore 和排序键 TopScoreDateTime 的全局二级索引。您可以使用这样的索引确定高分数与一天当中玩游戏的时间之间是否存在相关性。

每个索引键的属性必须是标量类型:String、Number 或 Binary。 (不可以是文档或集。)您可以将任何数据类型的属性投影到全局二级索引中,其中包括标量、文档和集。有关数据类型的完整列表,请参阅 数据类型

必须为索引提供 ProvisionedThroughput 设置,该设置包括 ReadCapacityUnitsWriteCapacityUnits。这些预置吞吐量设置独立于表的相应设置,但是行为是类似的。有关更多信息,请参阅 全局二级索引 的预置吞吐量注意事项

描述表中的全局二级索引

要查看表中所有 全局二级索引 的状态,请使用 DescribeTable 操作。响应的 GlobalSecondaryIndexes 部分显示了表中的全部索引以及每个索引的当前状态 (IndexStatus)。

全局二级索引的 IndexStatus 是下列值之一:

  • CREATING - 索引当前正在创建过程中,尚不可使用。

  • ACTIVE - 索引已可以使用,应用程序可以对索引执行 Query 操作。

  • UPDATING - 正在更改预置的索引吞吐量设置。

  • DELETING - 当前正在删除索引,不能再使用该索引。

当 DynamoDB 构建全局二级索引之后,索引状态从 CREATING 变为 ACTIVE

向现有表添加全局二级索引

要向现有表添加全局二级索引,请将 UpdateTable 操作与 GlobalSecondaryIndexUpdates 参数配合使用。必须提供以下内容:

  • 索引名称。该名称在表中的全部索引中必须是唯一的。

  • 索引的键架构。您必须为索引分区键指定一个属性;您可以选择为索引排序键指定其他属性。这些键属性中任意一个都无需与表中的键属性相同。每个架构属性的数据类型必须是标量类型:String、Number 或 Binary。

  • 从表投影到索引的属性:

    • KEYS_ONLY - 索引中的每个项目仅包含表分区键和排序键值以及索引键值。

    • INCLUDE – 除 KEYS_ONLY 中描述的属性外,二级索引还包括您指定的其他非键属性。

    • ALL – 索引包含源表中的所有属性。

  • 索引的预置吞吐量设置,包括 ReadCapacityUnits 和 WriteCapacityUnits。这些预置的吞吐量设置与表的吞吐量设置是分开的。

每个 UpdateTable 操作只能创建一个全局二级索引。

注意

不能取消进行中的全局二级索引创建操作。

索引创建操作的阶段

向现有表添加新的全局二级索引时,表在构建索引的过程中仍然可用。但是,新索引要到状态从 CREATING 变为 ACTIVE 之后才能用于 Query 操作。

DynamoDB 在后台分两个阶段构建索引:

资源分配

DynamoDB 分配构建索引所需的计算和存储资源。

在资源分配阶段,IndexStatus 属性为 CREATINGBackfilling 属性为 False。使用 DescribeTable 操作可检索表及其全部二级索引的状态。

当索引处于资源分配阶段时,您不能删除其父表;也不能修改索引或表的预置吞吐量。您不能在表中添加或删除其他索引;但是,可以修改其他索引的预置吞吐量。

回填

对于表中的每个项目,DynamoDB 根据索引投影 (KEYS_ONLYINCLUDEALL) 确定写入索引的属性集,随后将这些属性写入索引。在回填阶段,DynamoDB 会跟踪表中正在添加、删除或更新的项目。根据需要,还会在索引中添加、删除或更新这些项目的属性。

在回填阶段,IndexStatus 属性为 CREATINGBackfilling 属性为 True。使用 DescribeTable 操作可检索表及其全部二级索引的状态。

回填索引的过程中,您不能删除其父表。但是,您仍可以修改该表及其任何全局二级索引的预置吞吐量。

注意

在回填阶段,冲突项目的有些写操作可能会成功,而有些将被拒绝。回填之后,所有与新索引的键架构发生冲突的项目写入操作都将被拒绝。建议在回填阶段完成后运行 Violation Detector 工具以检测并解决可能发生的任何键冲突。有关更多信息,请参阅 检测并更正索引键冲突

在资源分配和回填阶段进行的过程中,索引处于 CREATING 状态。在此期间,DynamoDB 对表执行读取操作;我们不会针对此读取活动向您收费。

当索引构建完成时,其状态变为 ACTIVE。在索引处于 ACTIVE 状态之前,您无法对其执行 QueryScan 操作。

注意

某些情况下,DynamoDB 会因索引键冲突而无法将表中的数据写入索引。如果某一属性值的数据类型与索引键架构数据类型不匹配,或者某一属性的大小超出索引键属性的最大长度,就可能发生这种情况。索引键冲突不影响全局二级索引的创建;但是,当索引变为 ACTIVE 时,冲突的键将不会出现在索引中。

DynamoDB 提供了用于查找和解决这些问题的独立工具。有关更多信息,请参阅 检测并更正索引键冲突

向大型表添加全局二级索引

构建全局二级索引所需的时间取决于多种因素,例如:

  • 表的大小

  • 表中可以包括在索引中的项目的数目

  • 投影到索引中的属性的数目

  • 索引的预置写入容量

  • 索引构建期间对主表执行的写入活动。

如果您要向超大型表添加全局二级索引,则创建过程可能需要很长时间才能完成。要监控进度并确定索引是否具有足够的写入容量,请参阅以下 Amazon CloudWatch 指标:

  • OnlineIndexPercentageProgress

  • OnlineIndexConsumedWriteCapacity

  • OnlineIndexThrottleEvents

注意

有关与 DynamoDB 相关的 CloudWatch 指标的更多信息,请参阅 DynamoDB 指标

如果索引上的预置写入吞吐量设置太低,则索引构建要用更长时间才能完成。要缩短构建新全局二级索引所需的时间,可以临时增加其预置写入容量。

注意

一般原则是,建议将索引的预置写入容量设置为表的写入容量的 1.5 倍。此设置对很多使用案例都很适宜;不过,实际要求可能更高或更低。

在回填索引的过程中,DynamoDB 使用内部系统容量从表读取数据。这是为了尽量降低创建索引所造成的影响,并确保表不会用尽读取容量。

然而,传入写入活动的容量超出索引预置写入容量的情况也可能发生。这样就出现了容量瓶颈:由于索引的写入活动受到限制,创建索引的操作需要更长时间才能完成。在构建索引的过程中,建议您监控索引的 Amazon CloudWatch 指标,以确定其使用的写入容量是否将要超出预置容量。若出现容量瓶颈,应增加索引的预置写入容量以避免在回填阶段造成写入限制。

创建索引后,应设置其预置写入容量以反映您的应用程序的正常使用情况。

修改索引创建

构建索引的过程中,您可以使用 DescribeTable 操作确定其所处的阶段。索引描述包括一个布尔属性 Backfilling,它用于指示 DynamoDB 当前是否正在向索引加载表中的项目。如果 Backfilling 为 True,则资源分配阶段完成,索引此时会回填。

在回填进行期间,您可以更新索引的预置吞吐量参数。您可能为了加快索引构建而决定执行此操作:可以在构建索引时增加索引的写入容量,事后再减小容量。要修改索引的预置吞吐量设置,请使用 UpdateTable 操作。索引状态将变为 UPDATING,并且在索引可以使用之前 Backfilling 将为 True。

在回填阶段,您不能在表中添加或删除其他索引。

注意

对于在 CreateTable 操作中创建的索引,Backfilling 属性不会出现在 DescribeTable 输出中。有关更多信息,请参阅 索引创建操作的阶段

从表中删除全局二级索引

如果您不再需要某个全局二级索引,则可使用 UpdateTable 操作将其删除。

每个 UpdateTable 操作只能删除一个全局二级索引。

删除全局二级索引不会对父表中的任何读取或写入活动产生影响。删除正在进行期间您仍可以修改其他索引的预置吞吐量。

注意

使用 DeleteTable 操作删除表时,也将删除该表上的所有全局二级索引。