

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

# 使用写入分片在分区之间均匀分配工作负载
<a name="bp-partition-key-sharding"></a>

在 Amazon Keyspaces 中跨分区更好地分配写入的一种方式是扩展空间。可以通过多种不同方式来进行。您可以添加一个额外的分区键列，将随机数写入到该列，以便在分区间分配行。或者，可以使用基于查询内容计算的数字。

## 使用复合分区键和随机值进行分片
<a name="bp-partition-key-sharding-random"></a>

在分区中更均匀地分配负载的一种策略是添加一个额外的分区键列并在其中写入随机数。然后在更大空间内随机写入。

例如，请考虑下表，该表包含一个代表日期的分区键。

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date,
   title text,
   description int,
   PRIMARY KEY (publish_date));
```

为了在分区间更均匀地分配此表，可以添加一个用于存储随机数的额外分区键列 `shard`。例如：

```
CREATE TABLE IF NOT EXISTS tracker.blogs (
   publish_date date, 
   shard int, 
   title text, 
   description int, 
   PRIMARY KEY ((publish_date, shard)));
```

插入数据时，您可以为 `shard` 列选择一个介于 `1` 和 `200` 之间的随机数。这将生成复合分区键值，比如 `(2020-07-09, 1)`、`(2020-07-09, 2)`，以此类推，直到 `(2020-07-09, 200)`。由于随机化分区键，每天表的写入将均匀分布在多个分区。这样可以提高并行度和总体吞吐量。

但是，要读取给定日期的所有行，必须针对所有分片查询这些行，然后合并结果。例如，先对分区键值 `(2020-07-09, 1)` 发出 `SELECT` 语句。然后，对 `(2020-07-09, 2)` 发出另一个 `SELECT` 语句，以此类推，直到 `(2020-07-09, 200)`。最后，应用程序必须合并所有这些 `SELECT` 语句的结果。

## 使用复合分区键和计算值进行分片
<a name="bp-partition-key-sharding-calculated"></a>

随机化策略可以显著改善写入吞吐量，但要读取特定行却很困难，因为您不知道在写入该行时，将哪个值写入 `shard` 列。要让读取单个行更轻松，可使用其他策略。不使用随机数在分区间分配行，而是使用可根据查询内容计算的数字。

考虑上一个示例，表在分区键中使用当天日期。现在假设每个行有一个可访问的 `title` 列，并且除了日期之外，您最常需要按标题查找行。在应用程序将行写入表之前，它可以根据标题计算哈希值，并使用该值来填充 `shard` 列。计算可能产生一个介于 1 和 200 之间非常均匀分布的数字，类似于随机策略所生成的数字。

简单的计算足够了，例如标题字符的 UTF-8 码位值的乘积，取模 200，加 1。复合分区键值是日期和计算结果的组合。

利用此策略，写入均匀分布在分区键值之间，从而均匀分布在物理分区之间。您可以对特定的行和日期轻松执行 `SELECT` 语句，因为您可以为特定的 `title` 值计算分区键值。

要读取指定日期的所有行，您仍然必须对每个 `(2020-07-09, N)` 键（其中，`N` 为 1-200）执行 `SELECT` 语句，然后应用程序必须合并所有结果。好处是避免出现单个“热门”分区键值，承担所有工作负载。