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

针对 全局二级索引 的最佳实践

本节介绍 全局二级索引 的一些最佳实践。

选择一个可以提供均匀工作负载的键

在创建 DynamoDB 表时,在整个表中均匀分配读取和写入活动十分重要。为此,应选择主键的属性,以便在多个分区间均匀分布数据。

此准则同样适用于 全局二级索引。请选择相对于索引中的项目数具有较多值的分区键和排序键。另外请注意,全局二级索引 不强制唯一性,因此,您需要了解这些键属性的基数。基数 是指特定属性中的不同值数(相对于您所拥有的项目的数目)。

例如,假设您有一个 Employee 表,它包含 NameTitleAddressPhoneNumberSalaryPayLevel 等属性。现在,假设有一个名为 PayLevelIndex 的全局二级索引,其中,PayLevel 是分区键。许多公司仅有数目很少的薪资代码,通常远少于 10 个,即使是有数十万名员工的公司也是如此。对于应用程序而言,这种索引没有什么益处,甚至毫无用处。

使用 PayLevelIndex 的另一个问题是不同值的分配不均匀。举例来说,公司中可能仅有几位高管,但有大量小时工。对 PayLevelIndex 的查询效率欠佳,这是因为读取活动不会在各个分区之间平均分布。

利用稀疏索引

对于表中的任何项目,DynamoDB 仅在该项目中存在索引键值时才会将相应条目写入 全局二级索引。对于全局二级索引,这是索引分区键及其排序键(如果存在)。如果索引键值不是出现在每个表项目中,则该索引被认为是稀疏 索引。

您可以使用稀疏 全局二级索引 有效查找具有不常见属性的表项目。为此,您可利用这样的事实:不包含 全局二级索引 属性的表项目根本没有编制索引。例如,在 GameScores 表中,某些玩家可能已取得一定的游戏成绩(如“Champ”),但大多数玩家还没有。您可以创建一个含有分区键 Champ 和排序键 UserId 的全局二级索引,而不是扫描整个 GameScores 表以寻找 Champ。这样可方便地通过查询索引(而不是扫描表)找到所有 Champ。

这种查询非常高效,这是因为索引中的项目数远远少于表中的项目数。另外,投影到索引中的表属性越少,从索引消耗的读取容量单位就越少。

使用 全局二级索引 进行快速查找

您可以使用任何表属性为索引分区键和排序键创建全局二级索引。您甚至可以创建与表具有完全相同的键属性的索引,仅投影非键属性的一个子集。

具有重复键架构的 全局二级索引 的一个使用案例是以最低预配置吞吐量快速查找表数据。如果表有大量属性,并且这些属性本身很大,则对表的每个查询都可能占用大量读取容量。如果大多数查询不需要返回那么多数据,则可以创建具有最低数量投影属性(甚至无任何投影属性)的 全局二级索引,而不是创建表的键。这样,您就可以查询小得多的全局二级索引,并且,如果您确实需要其他属性,可以随后使用相同的键值来查询表。

创建一个最终一致性只读副本

您可以创建与表具有相同键架构并且部分(或全部)非键属性被投影到索引中的 全局二级索引。在应用程序中,可将部分(或全部)读取活动定向此索引,而不是表。这样,您无需修改表上的预配置读取容量来响应增加的读取活动。请注意,在写入表和数据出现在索引中之间会有一个较短的传播延迟;在从索引读取时,应用程序预期会有最终一致性。

您可以创建多个全局二级索引,以支持应用程序的特性。举例来说,假设您有两个读取特性截然不同的应用程序:一个需要最高读取性能的高优先级应用程序,以及一个可容忍读取活动偶尔受限的低优先级应用程序。如果这两个应用程序均读取同一个表,则它们可能会互相干扰:低优先级应用程序中需要执行大量读取操作的负载可能会占用该表的所有可用读取容量,这会导致高优先级应用程序的读取活动受到限制。如果创建两个 全局二级索引,一个具有较高的预配置读取吞吐量设置,另一个具有较低的设置,则可以有效理清这两个不同的工作负载,来自每个应用程序的读取活动均被重定向到各自的索引。通过此方法,您可根据每个应用程序的读取特征定制预配置的读取吞吐量。

在某些情况下,您可能需要限制可读取表的应用程序。举例来说,您可能具有从网站捕获点击流活动并频繁写入到 DynamoDB 表的应用程序。您可能决定通过阻止大多数应用程序的读取访问来隔离此表。(有关更多信息,请参阅 使用 IAM 策略条件实现精细访问控制。)但如果有其他应用程序需要对这些数据执行即席查询,可为此创建一个或多个 全局二级索引。当创建索引时,务必仅投影应用程序实际需要的属性。这样,这些应用程序可读取更多数据,占用更少的预配置读取容量,而不是必须从表中读取大项目。随着时间的推移,这样可以节省大量成本。