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

项目大小和容量单位消耗

在为表选择读取和写入容量设置之前,您应先了解您的数据以及应用程序访问数据的方式。这些输入可帮助您确定表的总体存储和吞吐量需求以及应用程序需要的吞吐容量。DynamoDB 表是无架构的(主键除外),因此,表中的项目可具有不同的属性、大小和数据类型。

项目的总大小是其属性名称和值的长度总和。您可以使用以下准则来估算属性大小:

  • 字符串是使用 UTF-8 二进制编码的 Unicode。字符串大小为 (属性名长度)+(UTF-8 编码的字节数)

  • 数字的长度是可变的,最多 38 个有效位。系统会删减开头和结尾的 0。数字大小约为 (属性名长度)+(每 2 个有效位对应 1 个字节)+(1 个字节)

  • 必须先采用 base64 格式对二进制值进行编码,然后才能将其发送到 DynamoDB,不过使用值的原始字节长度来计算大小。二进制属性的大小为 (属性名长度)+(原始字节数)

  • 空属性或布尔属性的大小为 (属性名长度)+(1 字节)

  • 对于类型为列表或映射的属性,不论其内容如何,都需要 3 个字节的开销。列表或映射的大小为 (属性名长度)+ 总和(嵌套元素大小)+(3 字节)。空列表或映射的大小为 (属性名长度)+(3 字节)

注意

建议您选择较短的属性名,而不要选择较长的属性名。这将帮助您优化容量单位消耗并减少数据所需的存储量。

读取的容量单位消耗

下面介绍 DynamoDB 读取操作如何占用读取容量单位:

  • GetItem — 从表中读取单个项目。要确定 GetItem 将使用的容量单位的数量,请使用项目大小并将其向上取整到下一个 4 KB 边界。如果您已指定强一致性读取,则这是所需的容量单位的数量。对于最终一致性读取 (默认值),使用此数字并将其除以 2。

    例如,如果您读取一个 3.5 KB 的项目,DynamoDB 会将项目大小向上取整到 4 KB。如果您读取一个 10 KB 的项目,DynamoDB 会将项目大小向上取整到 12 KB。

  • BatchGetItem — 从一个或多个表中读取多达 100 个项目。DynamoDB 将批次中的每个项目作为单个 GetItem 请求,因此 DynamoDB 会先将每个项目的大小向上取整到下一个 4 KB 界限值,然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如,如果 BatchGetItem 读取一个 1.5 KB 的项目和一个 6.5 KB 的项目,DynamoDB 计算得出的大小为 12 KB (4 KB + 8 KB) 而不是 8 KB (1.5 KB + 6.5 KB)。

  • Query — 读取具有相同分区键值的多个项目。返回的所有项目将视为一个读取操作,此时 DynamoDB 会计算所有项目的总大小,然后向上取整到下一个 4 KB 界限值。例如,假设您的查询返回了 10 个项目,它们合并后的大小为 40.8 KB。DynamoDB 将为该操作的项目大小向上取整为 44 KB。如果查询返回了 1500 个项目,每个项目大小为 64 个字节,则累计大小为 96 KB。

  • Scan — 读取表中的所有项目。DynamoDB 所考量的是评估所得的项目大小,而不是扫描返回项目的大小。

如果您对不存在的项目执行读取操作,则 DynamoDB 仍会占用预置的读取吞吐量:强一致性读取请求占用一个读取容量单位,而最终一致性读取请求占用 0.5 个读取容量单位。

对于任何会返回项目的操作,您都可以请求一个属性子集来进行检索,但是这样做不会对项目大小的计算有影响。另外,QueryScan 返回的是项目数而不是属性值。获取项目数会使用同等数量的读取容量单位,且依据的是相同的项目大小计算,这是因为 DynamoDB 必须读取每个项目才能增加计数。

读取操作和读取一致性

前面的计算都假设提交的是强一致性读取请求。如果提交的是最终一致性读取请求,该操作占用的容量单位将仅相当于强一致性读取请求的一半。对于最终一致性读取请求,如果总的项目大小为 80 KB,该操作仅会占用 10 个容量单位。

写入的容量单位消耗

下面介绍 DynamoDB 写入操作如何占用写入容量单位:

  • PutItem — 将单个项目写入表中。如果该表中存在具有相同主键的项目,此操作会替换该项目。在计算预置的吞吐量占用时,起作用的项目是二者中较大的那个。

  • UpdateItem — 将修改表中的单个项目。DynamoDB 将考虑项目在更新前后显示的大小。占用的预置吞吐量会反映这些项目大小中较大的值。即使您只更新项目属性的子集,UpdateItem 仍会占用全部的预置吞吐量 (“之前”和“之后”项目大小中的较大者)。

  • DeleteItem — 从表中删除单个项目。预置吞吐量占用情况取决于已删除的项目大小。

  • BatchWriteItem — 将多达 25 个项目写入一个或多个表中。DynamoDB 将批次中的每个项目作为单个 PutItemDeleteItem 请求进行处理(不支持更新),因此 DynamoDB 会先将每个项目的大小向上取整到下一个 1 KB 界限值,然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如,如果 BatchWriteItem 写入一个 500 字节的项目和一个 3.5 KB 的项目,则 DynamoDB 计算得出的大小为 5 KB (1 KB + 4 KB),而不是 4 KB (500 字节 + 3.5 KB)。

对于 PutItemUpdateItemDeleteItem 操作,DynamoDB 会将该项目大小向上取整到下一个 1 KB。例如,如果您添加或删除一个 1.6 KB 的项目,DynamoDB 会将该项目大小向上取整到 2 KB。

PutItemUpdateItemDeleteItem 都支持条件写入,在这种情况下,您可以指定一个必须计算为 true 的表达式以便成功执行操作。如果该表达式计算为 false,DynamoDB 仍会占用表的写入容量单位:

  • 对于现有项目,所占用的写入容量单位数将取决于新项目的大小。(例如,1 KB 项目的一次无效条件写入会占用一个写入容量单位;如果新项目增大一倍,则无效条件写入会占用两个写入容量单位。)

  • 对于新项目,DynamoDB 将占用一个写入容量单位。