

# Amazon DynamoDB 中的约束
<a name="Constraints"></a>

本节介绍 Amazon DynamoDB 中的当前约束（以前称为限制）。

**注意**  
DynamoDB 中的所有大小测量值都使用基于二进制的单位。DynamoDB 指定 1 KB = 1024 字节、1 MB = 1024 KB、1 GB = 1024 MB、1 TB = 1024 GB。

**Topics**
+ [读/写容量模式](#default-limits-capacity-modes)
+ [二级索引](#limits-secondary-indexes)
+ [分区键和排序键](#limits-partition-sort-keys)
+ [命名规则](#limits-naming-rules)
+ [数据类型](#limits-data-types)
+ [物品](#limits-items)
+ [属性](#limits-attributes)
+ [表达式参数](#limits-expression-parameters)
+ [DynamoDB 事务](#limits-dynamodb-transactions)
+ [DynamoDB Streams](#constraints-dynamodb-streams)
+ [DynamoDB Accelerator (DAX)](#limits-dax)
+ [特定于 API 的约束](#limits-api)
+ [静态 DynamoDB 加密](#limits-dynamodb-encryption)

## 读/写容量模式
<a name="default-limits-capacity-modes"></a>

在 24 小时滚动窗口内，表最多可以从预置容量模式切换到按需模式四次。您可以随时将表从按需模式切换到预置容量模式。

有关在读取和写入容量模式之间切换的更多信息，请参阅[在 DynamoDB 中切换容量模式时的注意事项](bp-switching-capacity-modes.md)。

### 容量单位大小（对于预调配表）
<a name="limits-capacity-units"></a>

一个读取容量单位 = 对大小为 4KB 的项目每秒执行一次强一致性读取，或每秒执行两次最终一致性读取。

一个写入容量单位 = 对大小为 1 KB 的项目每秒执行一次写入。

事务读取请求需要 2 个读取容量单位才能对大小最多为 4KB 的项目每秒执行一次读取。

事务写入请求需要 2 个写入容量单位才能对大小最多为 1 KB 的项目每秒执行一次写入。

### 请求单位大小（对于按需表）
<a name="limits-request-units"></a>

一个读取请求单位 = 对大小最多为 4 KB 的项目每秒执行一次强一致性读取，或每秒执行两次最终一致性读取。

一个写入请求单位 = 对大小最多为 1 KB 的项目每秒执行一次写入。

事务读取请求需要 2 个读取请求单位才能对大小最多为 4 KB 的项目每秒执行一次读取。

事务写入请求需要 2 个写入请求单位才能对大小最多为 1 KB 的项目每秒执行一次写入。

## 二级索引
<a name="limits-secondary-indexes"></a>

### 每个表的投影二级索引属性
<a name="limits-tables-projected-secondary-index-attributes"></a>

您最多可将 100 个属性投影到表的所有本地和全局二级索引，此限制只适用于用户指定的投影属性。

在 `CreateTable` 操作中，如果您指定 `INCLUDE` 的 `ProjectionType`，则 `NonKeyAttributes` 中指定的属性总数量（所有二级索引的属性之和）不能超过 100。如果您将同一属性名称投影到两个不同的索引中，就会在确定总量时计为两个不同的属性。

此限制不适用于具有 `ProjectionType` 为 `KEYS_ONLY` 或 `ALL` 的二级索引。

## 分区键和排序键
<a name="limits-partition-sort-keys"></a>

### 分区键长度
<a name="limits-partition-key-length"></a>

分区键值的最小长度为 1 个字节，最大长度为 2048 个字节。

### 分区键值
<a name="limits-partition-key-values"></a>

表和二级索引的不同分区键值的数量没有实际限制。

### 排序键长度
<a name="limits-sort-key-length"></a>

排序键值的最小长度为 1 个字节。最大长度为 1024 个字节。

### 排序键值
<a name="limits-sort-key-values"></a>

一般情况下，每个分区键值的不同排序键值的数量没有实际限制。

具有二级索引的表则例外。项目集合是一组具有相同分区键属性值的项目。在全局二级索引中，项目集合独立于基表（并可以具有不同的分区键属性），但在本地二级索引中，索引视图与表中的项目位于同一个分区中，并且共享相同的分区键属性。由于这种本地性质，当一个表有一个或多个 LSI 时，项目集合不能分布到多个分区。

对于包含一个或多个 LSI 的表，项目集合的大小不能超过 10GB。这包括所有基表项目和具有相同分区键属性值的所有投影 LSI 视图。10GB 是分区的最大大小。有关更多详细信息，请参阅 [项目集合大小限制](LSI.md#LSI.ItemCollections.SizeLimit)。

## 命名规则
<a name="limits-naming-rules"></a>

### 表名称和二级索引名称
<a name="limits-naming-rules-tables-secondary-indexes"></a>

表名称和二级索引名称的长度必须至少为 3 个字符，但不得超过 255 个字符。以下是允许的字符：
+ `A-Z`
+ `a-z`
+ `0-9`
+ `_`（下划线）
+ `-`（连字符）
+ `.`（圆点）

### 属性名称
<a name="limits-naming-rules-attributes"></a>

一般情况下，属性名称的长度必须至少为 1 个字符，但不得超过 64KB。

存在以下例外。这些属性名称的长度不得超过 255 个字符：
+ 二级索引分区键名称。
+ 二级索引排序键名称。
+ 任意用户指定的投影属性的名称（仅适用于本地二级索引）。在 `CreateTable` 操作中，如果您将 `ProjectionType` 指定为 `INCLUDE`，那么 `NonKeyAttributes` 参数中属性名称的长度就有限制。`KEYS_ONLY` 和 `ALL` 投影类型不受此影响。

这些属性名称必须使用 UTF-8 进行编码，并且每个名称（编码后）的总大小不能超过 255 字节。

## 数据类型
<a name="limits-data-types"></a>

### 字符串
<a name="limits-data-types-strings"></a>

字符串的长度会受到 400 KB 的最大项目大小限制。

字符串是使用 UTF-8 二进制编码的 Unicode。由于 UTF-8 是宽度可变的编码，因此 DynamoDB 使用其 UTF-8 字节确定字符串的长度。

### 数字
<a name="limits-data-types-numbers"></a>

数字最多可精确到 38 位，并且可以为正数、负数或零。
+ 正数范围：`1E-130` 到 `9.9999999999999999999999999999999999999E+125`
+ 负数范围：`-9.9999999999999999999999999999999999999E+125` 到 `-1E-130`

DynamoDB 使用 JSON 字符串代表请求和回复中的数字数据。有关更多信息，请参阅 [DynamoDB 低级 API](Programming.LowLevelAPI.md)。

如果数字精度十分重要，则应使用从数字类型转换的字符串将数字传递给 DynamoDB。

### 二元
<a name="limits-data-types-binary"></a>

二进制的长度会受到项目大小上限 400 KB 的限制。

使用二进制属性的应用程序必须先用 Base64 格式对数据进行编码，然后将其发送至 DynamoDB。接收到数据后，DynamoDB 将数据解码为无符号字节数组，将其用作属性的长度。

## 物品
<a name="limits-items"></a>

### 项目大小
<a name="limits-items-size"></a>

DynamoDB 中的项目大小上限为 400 KB，包括属性名称二进制长度（UTF-8 长度）和属性值长度（同为二进制长度）。属性名称也包含在此大小限制之内。

例如，比如一个项目有两个属性：一个属性名为“shirt-color”，值为“R”，另一个属性名为“shirt-size”，值为“M”。该项目的总大小为 23 字节。

### 具有本地二级索引的表的项目大小
<a name="limits-items-size-secondary-indexes"></a>

对于表上的每个本地二级索引，以下对象的总大小有 400 KB 的限制：
+ 表中项目数据的大小。
+ 所有本地二级索引中对应条目的大小（包括键值和投影属性）。

## 属性
<a name="limits-attributes"></a>

### 每个项目的属性名称-值对
<a name="limits-attributes-name-value-pairs"></a>

每个项目的属性的累计大小必须在 DynamoDB 项目大小上限 (400 KB) 以内。

### 列表、映射或集中值的数量
<a name="limits-attributes-number"></a>

只要包含值的项目大小在 400 KB 这一大小限制以内，列表、映射或集中值的数量就没有限制。

### 属性值
<a name="limits-attributes-values"></a>

如果属性未用作表或索引的键属性，则允许使用空的字符串和二进制属性值。“集”、“列表” 和 “映射” 类型中允许使用空的字符串和二进制值。属性值不能是空集（字符串集、数字集或二进制集）。但可以是空列表和映射。

### 嵌套属性深度
<a name="limits-attributes-nested-depth"></a>

DynamoDB 支持高达 32 级深度的嵌套属性。

## 表达式参数
<a name="limits-expression-parameters"></a>

表达式参数包括 `ProjectionExpression`、`ConditionExpression`、`UpdateExpression` 和 `FilterExpression`。

### 长度
<a name="limits-expression-parameters-lengths"></a>

任何表达式字符串的最大长度均为 4KB。例如，`ConditionExpression` `a=b` 的大小是 3 个字节。

任何一个表达式属性名称或表达式属性值的最大长度均为 255 字节。例如，`#name` 是 5 个字节；`:val` 是 4 个字节。

表达式中所有替代变量的最大长度为 2 MB。这是所有 `ExpressionAttributeNames` 和 `ExpressionAttributeValues` 的长度之和。

### 运算符数和操作数
<a name="limits-expression-parameters-operators"></a>

`UpdateExpression` 中允许的运算符或函数的最大数量为 300。例如，*UpdateExpression* `SET a = :val1 + :val2 + :val3` 包括两个“`+`”运算符。

`IN` 比较器的操作数最大数量为 100。

### 保留字
<a name="limits-expression-parameters-reserved-words"></a>

DynamoDB 不会阻止您使用与保留字冲突的名称。（有关完整列表，请参阅 [DynamoDB 中的保留字](ReservedWords.md)。）

但是，如果您在表达式参数中使用了保留字，则还必须指定 `ExpressionAttributeNames`。有关更多信息，请参阅 [DynamoDB 中的表达式属性名称（别名）](Expressions.ExpressionAttributeNames.md)。

## DynamoDB 事务
<a name="limits-dynamodb-transactions"></a>

DynamoDB 事务 API 操作具有以下约束：
+ 一个事务不能包含超过 100 个具有唯一性的项目。
+ 一个事务不能包含超过 4 MB 数据。
+ 不能对同一个表中的同一个项目执行事务中的两个操作。例如，您不能在一个事务中对同一个项目同时执行 `ConditionCheck` 和 `Update`。
+ 事务无法对超过一个 AWS 账户或区域中的表执行操作。
+ 事务操作仅在最初写入的 AWS 区域内提供原子性、一致性、隔离性和持久性 (ACID) 保证。全局表中不支持跨区域的事务。例如，假设您在美国东部（俄亥俄州）和美国西部（俄勒冈州）区域有一个带副本的全局表，并且您在美国东部（弗吉尼亚州北部）区域执行 `TransactWriteItems` 操作。在此情况下，您可能会在复制更改时观察到美国西部（俄勒冈州）区域内已部分完成的事务。更改仅在源区域中提交后才复制到其他区域。

## DynamoDB Streams
<a name="constraints-dynamodb-streams"></a>

### DynamoDB Streams 中的分片同时读取器
<a name="limits-dynamodb-streams-simultaneous-shard-readers"></a>

对于作为非全局表的单区域表，您可以设计最多两个进程来同时从同一个 DynamoDB Streams 分区读取数据。超过此限制会导致请求被拒。对于全局表，我们建议您将并行读取器的数量限制为一个，以避免请求节流。

## DynamoDB Accelerator (DAX)
<a name="limits-dax"></a>

### AWS 区域可用性
<a name="limits-dax-regions"></a>

有关提供 DAX 的 AWS 区域，请参阅《AWS 一般参考》**中的 [DynamoDB Accelerator (DAX)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_dax_region)。

### Nodes
<a name="limits-dax-nodes"></a>

DAX 集群由刚好 1 个主节点和 0 到 10 个只读副本节点组成。

一个 AWS 区域中的节点总数（每个 AWS 账户）不能超过 50 个。

### 参数组
<a name="limits-dax-parameter-groups"></a>

您最多可以为每个区域创建 20 个 DAX 参数组。

### 子网组
<a name="limits-dax-subnet-groups"></a>

您最多可以为每个区域创建 50 个 DAX 子网组。

在一个子网组中，您最多可以定义 20 个子网。

**重要**  
一个 DAX 集群最多支持 500 个 DynamoDB 表。一旦超过 500 个 DynamoDB 表，集群的可用性和性能就可能会降低。

## 特定于 API 的约束
<a name="limits-api"></a>

**`CreateTable`/`UpdateTable`/`DeleteTable`/`PutResourcePolicy`/`DeleteResourcePolicy`**  
通常，您能够以任意组合同时运行多达 500 个 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)、[UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html)、[DeleteTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html)、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) 和 [DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html) 请求。因此，处于 `CREATING`、`UPDATING` 或 `DELETING` 状态的表的总数不能超过 500 个。  
您可以跨表组，每秒提交多达 2500 个可变（`CreateTable`、`DeleteTable`、`UpdateTable`、`PutResourcePolicy` 和 `DeleteResourcePolicy`）控制面板 API 请求的请求。但是，`PutResourcePolicy` 和 `DeleteResourcePolicy` 请求的单独限制较低。有关更多信息，请参阅 `PutResourcePolicy` 和 `DeleteResourcePolicy` 的以下配额详细信息。  
包含基于资源的策略的 `CreateTable` 和 `PutResourcePolicy` 请求将针对每 KB 算作两个额外的请求。例如，策略大小为 5 KB 的 `CreateTable` 或 `PutResourcePolicy` 请求将算作 11 个请求。1 个是针对 `CreateTable` 请求，10 个是针对基于资源的策略（2 x 5 KB）。同样，大小为 20 KB 的策略将算作 41 个请求。1 个是针对 `CreateTable` 请求，40 个是针对基于资源的策略（2 x 20 KB）。    
`PutResourcePolicy`  
您可以跨一组表每秒提交多达 25 个 `PutResourcePolicy` API 请求。针对单个表成功执行请求表后，在接下来的 15 秒内不支持任何新的 `PutResourcePolicy` 请求。  
基于资源的策略文档支持的最大大小为 20 KB。在计算策略大小时，DynamoDB 会将空格计入这一限制。  
`DeleteResourcePolicy`  
您可以跨一组表每秒提交多达 50 个 `DeleteResourcePolicy` API 请求。针对单个表成功执行 `PutResourcePolicy` 请求后，在接下来的 15 秒内不再支持任何 `DeleteResourcePolicy` 请求。

**`BatchGetItem`**  
一个 `BatchGetItem` 操作最多可以检索 100 个项目。检索到的所有项目总大小不能超过 16 MB。

**`BatchWriteItem`**  
一个 `BatchWriteItem` 操作最多可包含 25 个 `PutItem` 或 `DeleteItem` 请求。写入的所有项目总大小不能超过 16 MB。

**`DescribeStream`**  
您每秒最多可以调用 `DescribeStream` 10 次。

**`DescribeTableReplicaAutoScaling`**  
`DescribeTableReplicaAutoScaling` 方法每秒仅支持 10 个请求。

**`DescribeLimits`**  
`DescribeLimits` 只应定期调用。如果您在一分钟内多次调用它，则可能遇到限制错误。

**`DescribeContributorInsights`/`ListContributorInsights`/`UpdateContributorInsights`**  
`DescribeContributorInsights`、`ListContributorInsights` 和 `UpdateContributorInsights` 只应定期调用。对于这些 API 中的每一个，DynamoDB 每秒最多支持五个请求。

**`DescribeTable`/`ListTables`/`GetResourcePolicy`**  
您可以每秒组合提交多达 2500 个只读（`DescribeTable`、`ListTables` 和 `GetResourcePolicy`）控制面板 API 请求。`GetResourcePolicy` API 的单独限制较低，为每秒 100 个请求。

**`DescribeTimeToLive`**  
`DescribeTimeToLive` 操作限制为每秒 10 个读取请求单位。如果超过此限制，DynamoDB 将返回 `ThrottlingException` 错误。

**`Query`**  
来自 `Query` 的结果集大小上限为每个调用 1 MB。您可以使用查询响应中的 `LastEvaluatedKey` 检索更多结果。

**`Scan`**  
来自 `Scan` 的结果集大小上限为每个调用 1 MB。您可以使用扫描响应中的 `LastEvaluatedKey` 检索更多结果。

**`UpdateKinesisStreamingDestination`**  
执行 `UpdateKinesisStreamingDestination` 操作时，您最多可以在 24 小时内 3 次将 `ApproximateCreationDateTimePrecision` 设置为新值。

**`UpdateTableReplicaAutoScaling`**  
`UpdateTableReplicaAutoScaling` 方法每秒仅支持 10 个请求。

**`UpdateTableTimeToLive`**  
`UpdateTableTimeToLive` 方法仅支持每小时针对指定的表发出一个启用或禁用 `Time to Live (TTL)` 的请求。完全处理此更改可能最多需要一个小时。在这一个小时的持续时间内，对同一个表的任何其他 `UpdateTimeToLive` 调用都会导致 ValidationException。

## 静态 DynamoDB 加密
<a name="limits-dynamodb-encryption"></a>

从创建表开始，每 24 小时时段，允许在 AWS 拥有的密钥、AWS 托管式密钥 和客户托管密钥之间以每个表为基础切换最多四次。此外，如果过去 6 小时内未执行任何更改，则可以执行额外的更改。这实际上将每日的更改操作的最大次数设置为 8 次（在前 6 个小时内为 4 次更改操作，对于一天内的每个后续 6 小时时段，为 1 次更改操作）。

您可以根据需要切换加密密钥以使用 AWS 拥有的密钥，即使上述配额已用尽。

相关配额如下，但您也可以请求提高配额。要请求提高服务配额，请参阅 [https://aws.amazon.com/support](https://aws.amazon.com/support)。