

# DynamoDB 读取和写入操作
<a name="read-write-operations"></a>

DynamoDB 读取操作允许您通过指定分区键值和排序键值（可选），从表中检索一个或多个项目。使用 DynamoDB 写入操作，可以在表中插入、更新或删除项目。本主题说明了这两个操作的容量单位消耗。

**Topics**
+ [读取操作的容量单位消耗](#read-operation-consumption)
+ [写入操作的容量单位消耗](#write-operation-consumption)

## 读取操作的容量单位消耗
<a name="read-operation-consumption"></a>

DynamoDB 读取请求可以是强一致性、最终一致性或事务性的。
+ 一个不超过 4 KB 的项目的*强一致性*读取请求需要一个读取单位。
+ 一个不超过 4 KB 的项目的*最终一致性*读取请求需要半个读取单位。
+ 一个不超过 4 KB 的项目的*事务性*读取请求需要两个读取单位。

要了解有关 DynamoDB 读取一致性模型的更多信息，请参阅 [DynamoDB 读取一致性](HowItWorks.ReadConsistency.md)。

对于读取操作，项目大小会向上取整为 4KB 的倍数。例如，读取一个 3500 字节的项目将使用的吞吐量与读取一个 4KB 项目相同。

如果您需要读取大于 4 KB 的项目，DynamoDB 需要额外的读取单位。所需读取单位的总数取决于项目大小以及您需要的是最终一致性读取还是强一致性读取。例如，如果您的项目大小为 8 KB，则需要 2 个读取单位才能维持一次强一致性读取。如果您选择最终一致性读取，则需要 1 个读取单位；或者对于事务性读取请求，需要 4 个读取单位。

下面的列表介绍 DynamoDB 读取操作如何消耗读取单位：
+ [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)：从表中读取单个项目。要确定 `GetItem` 将消耗的读取单位的数量，请使用项目大小并将其向上取整到下一个 4 KB 界限值。如果您指定了强一致性读取，则这是所需的容量单位数。对于最终一致性读取（默认设置），请将此数字除以 2。

  例如，如果您读取一个 3.5 KB 的项目，DynamoDB 会将项目大小向上取整到 4KB。如果您读取一个 10 KB 的项目，DynamoDB 会将项目大小向上取整到 12 KB。
+ [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)：从一个或多个表中读取最多 100 个项目。DynamoDB 将批处理中的每个项目作为单独的 `GetItem` 请求。DynamoDB 首先将每个项目的大小向上取整到下一个 4 KB 界限值，然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如，如果 `BatchGetItem` 读取两个大小分别为 1.5 KB 和 6.5 KB 的项目，则 DynamoDB 将大小计算为 12 KB（4 KB \$1 8 KB）。DynamoDB 不会将大小计算为 8 KB（1.5 KB \$1 6.5 KB）。
+ [Query](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)：读取具有相同分区键值的多个项目。返回的所有项目将视为一个读取操作，DynamoDB 会计算所有项目的总大小。然后，DynamoDB 将结果向上取整到下一个 4 KB 界限值。例如，假设查询返回 10 个项目，其组合大小为 40.8 KB。DynamoDB 将操作的项目大小舍入为 44KB。如果查询返回了 1500 个项目，每个项目大小为 64 个字节，则累计大小为 96 KB。
+ [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)：读取表中的所有项。DynamoDB 所考量的是评估所得的项目大小，而不是扫描返回项目的大小。有关 Scan 操作的更多信息，请参阅[在 DynamoDB 中扫描表](Scan.md)。

**重要**  
如果您对某个*不存在的项目*执行读取操作，DynamoDB 仍将消耗读取吞吐量，如上所述。对于 `Query`/`Scan` 操作，即使不存在数据，仍会根据读取一致性以及为处理请求而搜索的分区数量，向您收取额外读取吞吐量的费用。

对于返回项目的任意操作，您可以请求检索属性的子集。不过，这样做对项目大小计算没有影响。另外，`Query` 和 `Scan` 返回的是项目数而不是属性值。获取项目计数将使用相同数量的读取单位，并且需要执行相同的项目大小计算。这是因为 DynamoDB 必须读取每个项目才能增加计数。

## 写入操作的容量单位消耗
<a name="write-operation-consumption"></a>

一个写入单位表示对大小最多为 1 KB 的项目执行一次写入。如果您需要写入大于 1 KB 的项目，DynamoDB 需要消耗额外的写入单位。事务性写入请求需要 2 个写入单位，才能对大小多达 1 KB 的项目执行一次写入。所需的写入请求单位的总数取决于项目大小。例如，如果您的项目大小为 2 KB，您需要 2 个写入单位才能维持一个读取请求；而对于事务性写入请求，则需要 4 个写入单位。

对于写入操作，项目大小会向上取整为 1 KB 的倍数。例如，写入一个 500 字节的项目使用的吞吐量与写入一个 1 KB 项目相同。

下面的列表介绍 DynamoDB 写入操作如何消耗写入单位：
+ [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)：将单个项目写入表中。如果该表中存在具有相同主键的项目，此操作会替换该项目。在计算预置的吞吐量占用时，起作用的项目是二者中较大的那个。
+ [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)：修改表中的单个项目。DynamoDB 将考虑项目在更新前后显示的大小。消耗的预置吞吐量反映这些项目大小中较大的数据。即使您更新项目属性的子集，`UpdateItem` 仍会消耗全部的预置吞吐量（“之前”和“之后”项目大小中的较大者）。
+ [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)：从表中移除单个项目。预置吞吐量占用情况取决于已删除的项目大小。
+ [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)：向一个或多个表写入最多 25 个项目。DynamoDB 将批处理中的每个项目作为单独的 `PutItem` 或者 `DeleteItem` 请求（不支持更新）。DynamoDB 首先将每个项目的大小向上取整到下一个 1 KB 界限值，然后再计算总大小。计算得到的结果未必与所有项目大小的总和相同。例如，如果 `BatchWriteItem` 读取两个大小分别为 500 字节和 3.5 KB 的项目，DynamoDB 将大小计算为 5 KB（1 KB \$1 4 KB）。DynamoDB 不会将大小计算为 4 KB（500 字节 \$1 3.5 KB）。

适用于`PutItem`、`UpdateItem`, 和 `DeleteItem` 操作时，DynamoDB 会将项目大小四舍五入到下一个 1 KB。例如，如果放入或删除 1.6 KB 的项目，则 DynamoDB 会将项目大小舍入为 2 KB。

`PutItem`、`UpdateItem` 和 `DeleteItem` 操作允许*有条件写入*，其中指定一个表达式的求值结果必须为 true，以便成功执行操作。如果该表达式计算为 false，DynamoDB 仍会消耗表的写入容量单位。消耗的写入容量单位数量将取决于项目的大小。此项目可以是表中的现有项目，也可以是您试图创建或更新的新项目。例如，假设一个现有项目为 300 KB。您正在尝试创建或更新的新项目为 310 KB。新项目消耗的写入容量单位将为 310 KB。