本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon Keyspaces 中的行
本节详细介绍如何使用 Amazon Keyspaces(Apache Cassandra 兼容)中的行。表是 Amazon Keyspaces 中的主要数据结构,而表中的数据则按列和行进行组织。
计算 Amazon Keyspaces 中的行大小
Amazon Keyspaces 提供完全托管式存储,可提供个位数毫秒级的读取和写入性能,还能在多个 Amazon 可用区中持久存储数据。Amazon Keyspaces 将元数据附加到所有行和主键列,以支持高效的数据访问和高可用性。
本节详细介绍如何估算 Amazon Keyspaces 中的编码行大小。在计算账单和限额使用量时,应使用编码行大小。在计算表的预置吞吐容量需求时,也应使用编码行大小。要计算 Amazon Keyspaces 中的编码行大小,可以遵循以下准则。
对于常规列(即不是主键的列)、聚类列或
STATIC
列,根据数据类型使用单元格数据的原始大小并加上所需的元数据。有关 Amazon Keyspaces 中支持的数据类型的更多信息,请参阅数据类型。下面列出了 Amazon Keyspaces 存储数据类型值和元数据的方式的一些主要区别。每个列名称所需的空间使用列标识符进行存储,并添加到存储在列中的每个数据值。列标识符的存储值取决于表中列的总数:
1–62 个列:1 个字节
63–124 个列:2 个字节
125–186 个列:3 个字节
每增加 62 个列,添加 1 个字节。请注意,在 Amazon Keyspaces 中,使用单个
INSERT
或UPDATE
语句最多可修改 225 个常规列。有关更多信息,请参阅Amazon Keyspaces 服务限额。分区键最多可包含 2048 个字节的数据。分区键中的每个键列最多需要 3 个字节的元数据。计算行大小时,应假设每个分区键列使用全部 3 个字节的元数据。
聚类列最多可存储 850 个字节的数据。除了数据值的大小外,每个聚类列还要求元数据占数据值大小的 20%。计算行大小时,应为每 5 个字节的聚类列数据值添加 1 个字节的元数据。
Amazon Keyspaces 将每个分区键和聚类键列的数据值存储两次。额外的开销用于高效查询和内置索引。
Cassandra
ASCII
、TEXT
和VARCHAR
字符串数据类型均使用采用 UTF-8 二进制编码的统一码存储在 Amazon Keyspaces 中。Amazon Keyspaces 中的字符串大小等于 UTF-8 编码的字节数。Cassandra
INT
、BIGINT
、SMALLINT
和TINYINT
数据类型以长度可变的数据值(最多可包含 38 位有效数字)的形式存储在 Amazon Keyspaces 中。系统会删减开头和结尾的 0。其中任何一种数据类型的大小约为每两个有效数字 1 个字节 + 1 个字节。Amazon Keyspaces 中的
BLOB
以该值的原始字节长度进行存储。Null
值或Boolean
值的大小为 1 个字节。存储集合数据类型(例如
LIST
或MAP
)的列需要 3 个字节的元数据,无论其内容如何。LIST
或MAP
的大小为(列 ID)+ 总和(嵌套元素的大小)+(3 个字节)。空LIST
或MAP
的大小为(列 ID)+(3 个字节)。每个单个LIST
或MAP
元素还需要 1 个字节的元数据。STATIC
列数据不计入 1MB 的最大行大小。要计算静态列的数据大小,请参阅计算 Amazon Keyspaces 中每个逻辑分区的静态列大小。启用该功能后,系统会为每行中的每个列存储客户端时间戳。这些时间戳大约占用 20-40 字节(取决于您的数据),并会增加该行的存储和吞吐量成本。有关更多信息,请参阅客户端时间戳在 Amazon Keyspaces 中的工作原理。
在行元数据的每行大小上增加 100 个字节。
编码数据行的总大小基于以下公式:
partition key columns + clustering columns + regular columns + row metadata = total encoded size of row
重要
所有列元数据(例如列 ID、分区键元数据、聚类列元数据以及客户端时间戳和行元数据)均计入 1MB 的最大行大小。
考虑以下表示例,其中所有列均为整数类型。此表包含两个分区键列、两个聚类列和一个常规列。由于此表包含五列,因此列名称标识符所需的空间为 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);
要估算此写入操作所需的总字节数,可以按照以下步骤操作。
通过将存储在一个分区键列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有分区键列重复此操作。
计算分区键第一列 (pk_col1) 的大小:
(2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
计算分区键第二列 (pk_col2) 的大小:
(2 bytes for the integer data type) x 2 + 1 byte for the column id + 3 bytes for partition key metadata = 8 bytes
将两列相加,得出分区键列的估算总大小:
8 bytes + 8 bytes = 16 bytes for the partition key columns
通过将存储在一个聚类列中的数据类型的字节和元数据字节相加,计算该列的大小。针对所有聚类列重复此操作。
计算聚类列第一列 (ck_col1) 的大小:
(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
计算聚类列第二列 (ck_col2) 的大小:
(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
将两列相加,得出聚类列的估算总大小:
6 bytes + 6 bytes = 12 bytes for the clustering columns
加上常规列的大小。在此示例中,我们只有一个列用于存储一个个位数整数,这需要 2 个字节,另外列 ID 还需要 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。