

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 估算 Amazon Keyspaces 中的行大小
<a name="calculating-row-size"></a>

Amazon Keyspaces 提供完全托管的存储，可提供个位数毫秒的读取和写入性能，并在多个可用区中持久存储数据。 AWS Amazon Keyspaces 将元数据附加到所有行和主键列，以支持高效的数据访问和高可用性。

本主题详细介绍了如何估计 Amazon Keyspaces 中行的编码大小。在计算账单和限额使用量时，应使用编码行大小。在估算表的预配置吞吐量容量要求时，也可以使用编码后的行大小。

要计算 Amazon Keyspaces 中的编码行大小，可以遵循以下准则。

**Topics**
+ [估计列的编码大小](#calculating-row-size-columns)
+ [根据数据类型估计数据值的编码大小](#calculating-row-size-data-types)
+ [考虑一下 Amazon Keyspaces 功能对行大小的影响](#calculating-row-size-features)
+ [选择正确的公式来计算一行的编码大小](#calculating-row-size-formula)
+ [行大小计算示例](#calculating-row-size-example)

## 估计列的编码大小
<a name="calculating-row-size-columns"></a>

本节介绍如何估计 Amazon Keyspaces 中列的编码大小。
+ **常规列**-对于常规列（即不是主键的列）、聚类列或`STATIC`列，请根据数据[类型](cql.elements.md#cql.data-types)使用单元格数据的原始大小并添加所需的元数据。下一节将列出数据类型以及 Amazon Keyspaces 存储数据类型值和元数据方式的一些主要区别。
+ **分区键列**-分区键最多可包含 2048 字节的数据。分区键中的每个键列最多需要 3 个字节的元数据。计算行大小时，应假设每个分区键列使用全部 3 个字节的元数据。
+ **聚类列**-群集列最多可以存储 850 字节的数据。除了数据值的大小外，每个聚类列还要求元数据占数据值大小的 20%。计算行大小时，应为每 5 个字节的聚类列数据值添加 1 个字节的元数据。
**注意**  
为了支持高效的查询和内置索引，Amazon Keyspaces 将每个分区键和集群键列的数据值存储两次。
+ **列名**-使用列标识符存储每个列名所需的空间，并将其添加到列中存储的每个数据值中。列标识符的存储值取决于表中列的总数：
  + 1–62 个列：1 个字节
  + 63–124 个列：2 个字节
  + 125–186 个列：3 个字节

  每增加 62 个列，添加 1 个字节。请注意，在 Amazon Keyspaces 中，使用单个 `INSERT` 或 `UPDATE` 语句最多可修改 225 个常规列。有关更多信息，请参阅 [Amazon Keyspaces 服务限额](quotas.md#table)。

## 根据数据类型估计数据值的编码大小
<a name="calculating-row-size-data-types"></a>

本节介绍如何估计 Amazon Keyspaces 中不同数据类型的编码大小。
+ **字符串类型** — Cassandra `ASCII` `TEXT`、和`VARCHAR`字符串数据类型都使用采用 UTF-8 二进制编码的 Unicode 存储在 Amazon Keyspaces 中。Amazon Keyspaces 中的字符串大小等于 UTF-8 编码的字节数。
+ **数字类型** — Cassandra `INT` `BIGINT`、、`SMALLINT``TINYINT`、和`VARINT`数据类型作为长度可变的数据值存储在 Amazon Keyspaces 中，最多包含 38 位有效数字。系统会删减开头和结尾的 0。其中任何一种数据类型的大小约为每两个有效数字 1 个字节 \$1 1 个字节。
+ **Blob 类型** — Amazon Keyspaces `BLOB` 中的 A 以该值的原始字节长度存储。
+ **布尔类型**-值或`Boolean`值的大小`Null`为 1 字节。
+ **集合类型**-存储集合数据类型（如`LIST`或`MAP`需要 3 字节的元数据）的列，无论其内容如何。`LIST` 或 `MAP` 的大小为（列 ID）\$1 总和（嵌套元素的大小）\$1（3 个字节）。空 `LIST` 或 `MAP` 的大小为（列 ID）\$1（3 个字节）。每个单个 `LIST` 或 `MAP` 元素还需要 1 个字节的元数据。
+ **用户定义类型**-[用户定义类型 (UDT)](udts.md) 无论其内容如何，都需要 3 个字节的元数据。对于每个 UDT 元素，Amazon Keyspaces 需要额外提供 1 字节的元数据。

  要计算 UDT 的编码大小，请从 UDT 字段`field value`的`field name`和开始：
  + **字段名**-顶级 UDT 的每个字段名都使用标识符存储。标识符的存储值取决于顶级 UDT 中字段的总数，可以在 1 到 3 个字节之间变化：
    + 1—62 个字段：1 个字节
    + 63—124 个字段：2 个字节
    + 125— 最大字段数：3 个字节
  + **字段值**-存储顶级 UDT 的字段值所需的字节取决于存储的数据类型：
    + **标量数据类型**-存储所需的字节与存储在常规列中的相同数据类型所需的字节相同。
    + **冻结 UDT**-对于每个冻结的嵌套 UDT，嵌套 UDT 的大小与 CQL 二进制协议中的大小相同。对于嵌套的 UDT，每个字段（包括空字段）存储 4 个字节，存储字段的值是字段值的 CQL 二进制协议序列化格式。
    + **冰雪奇缘系列**：
      + L@@ **IS** T and SE **T** — 对于嵌套的冻结`LIST`或`SET`，为集合的每个元素存储 4 个字节，再加上集合值的 CQL 二进制协议序列化格式。
      + MA@@ **P** — 对于嵌套的冻结`MAP`，每个键值对都有以下存储要求：
        + 为每个密钥分配 4 个字节，然后添加密钥的 CQL 二进制协议序列化格式。
        + 为每个值分配 4 个字节，然后添加该值的 CQL 二进制协议序列化格式。
+ F@@ **ROZEN 关键字** — 对于嵌套在冻结馆藏中的冻结集合，Amazon Keyspaces 不需要任何额外的字节来存储元数据。
+ S@@ **TATIC 关键字**-`STATIC` 列数据不计入最大行大小 1 MB。要计算静态列的数据大小，请参阅[计算 Amazon Keyspaces 中每个逻辑分区静态列的大小](static-columns-estimate.md)。

## 考虑一下 Amazon Keyspaces 功能对行大小的影响
<a name="calculating-row-size-features"></a>

本节显示 Amazon Keyspaces 中的功能如何影响行的编码大小。
+ **客户端时间戳** — 开启该功能时，会为每行中的每一列存储客户端时间戳。这些时间戳大约占用 20-40 字节（取决于您的数据），并会增加该行的存储和吞吐量成本。有关客户端时间戳的更多信息，请参阅。[Amazon Keyspaces 中的客户端时间戳](client-side-timestamps.md)
+ **生存时间 (TTL)** — 开启该功能后，TTL 元数据每行占用大约 8 个字节。此外，还会为每行的每一列存储 TTL 元数据。每列存储标量数据类型或冻结集合，TTL 元数据占用大约 8 个字节。如果该列存储的集合数据类型未冻结，则对于集合中的每个元素，TTL 需要大约 8 个额外的元数据字节。对于启用 TTL 时存储集合数据类型的列，可以使用以下公式。

  ```
  total encoded size of column = (column id) + sum (nested elements + collection metadata (1 byte) + TTL metadata (8 bytes)) +  collection column metadata (3 bytes)
  ```

  TTL 元数据会占该行的存储和吞吐量成本。有关 TTL 的更多信息，请参阅 [使用 Amazon Keyspaces（Apache Cassandra 兼容）的生存时间（TTL）功能让数据过期](TTL.md)。

## 选择正确的公式来计算一行的编码大小
<a name="calculating-row-size-formula"></a>

本节显示了不同的公式，您可以使用这些公式来估计 Amazon Keyspaces 中一行数据的存储或容量吞吐量需求。

根据您的目标，可以根据以下公式之一估算出一行数据的总编码大小：
+ **吞吐容量**-要估计一行的编码大小以评估所需的 read/write 请求单位 (RRUs/WRUs) or read/write capacity units (RCUs/WCUs)：

  ```
  total encoded size of row = partition key columns + clustering columns + regular columns
  ```
+ **存储大小**-要估计行的编码大小以预测`BillableTableSizeInBytes`，请添加该行存储所需的元数据：

  ```
  total encoded size of row = partition key columns + clustering columns + regular columns + row metadata (100 bytes)
  ```

**重要**  
所有列元数据，例如列 ID、分区键元数据、群集列元数据以及客户端时间戳、TTL 和行元数据，都计入最大行大小 1 MB。

## 行大小计算示例
<a name="calculating-row-size-example"></a>

考虑以下表示例，其中所有列均为整数类型。此表包含两个分区键列、两个聚类列和一个常规列。由于此表包含五列，因此列名称标识符所需的空间为 1 个字节。

```
CREATE TABLE mykeyspace.mytable(pk_col1 int, pk_col2 int, ck_col1 int, ck_col2 int, reg_col1 int, primary key((pk_col1, pk_col2),ck_col1, ck_col2));
```

在此示例中，我们在向表中写入一行时计算数据的大小，如以下语句所示：

```
INSERT INTO mykeyspace.mytable (pk_col1, pk_col2, ck_col1, ck_col2, reg_col1) values(1,2,3,4,5);
```

要估算此写入操作所需的总字节数，可以按照以下步骤操作。

1. 通过将存储在一个分区键列中的数据类型的字节和元数据字节相加，计算该列的大小。针对所有分区键列重复此操作。

   1. 计算分区键第一列 (pk\$1col1) 的大小：

      ```
      (2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
      ```

   1. 计算分区键第二列 (pk\$1col2) 的大小：

      ```
      (2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
      ```

   1. 将两列相加，得出分区键列的估算总大小：

      ```
      8 bytes + 8 bytes = 16 bytes for the partition key columns
      ```

1. 通过将存储在一个聚类列中的数据类型的字节和元数据字节相加，计算该列的大小。针对所有聚类列重复此操作。

   1. 计算聚类列第一列 (ck\$1col1) 的大小：

      ```
      (2 bytes for the integer data type) x 2 + 20% of the data value (2 bytes) for clustering column metadata + 1 byte for the column id  = 6 bytes
      ```

   1. 计算聚类列第二列 (ck\$1col2) 的大小：

      ```
      (2 bytes for the integer data type) x 2 + 20% of the data value (2 bytes) for clustering column metadata + 1 byte for the column id = 6 bytes
      ```

   1. 将两列相加，得出聚类列的估算总大小：

      ```
      6 bytes + 6 bytes = 12 bytes for the clustering columns
      ```

1. 加上常规列的大小。在此示例中，我们只有一个列用于存储一个个位数整数，这需要 2 个字节，另外列 ID 还需要 1 个字节。

1. 最后，要获得编码后的总行大小，请将所有列的字节数相加。要估算存储的计费大小，请为行元数据添加额外 100 字节：

   ```
   16 bytes for the partition key columns + 12 bytes for clustering columns + 3 bytes for the regular column + 100 bytes for row metadata = 131 bytes.
   ```

要了解如何使用 Amazon 监控无服务器资源 CloudWatch，请参阅[使用亚马逊监控亚马逊密钥空间 CloudWatch](monitoring-cloudwatch.md)。