DynamoDB GSI 分区包含大集合

DynamoDB GSI partition contains large set

我有一个 DynamoDB table,写入次数较多,读取次数较少。 Partition Key 足够小(每个分区大约 100 个项目)。写入此 table 的项目是一组 1k 到 100k 项目的一部分。这很好用。

我需要能够使用不同的 Sort Key 对整个批次执行查询。为了支持这个要求,我必须创建一个 Global Secondary Index,其中 Batch ID 作为 Partition Key 和适当的 Sort Key。它有效,但它意味着分区包含整个(可能有 100k 个项目)集。即使没有达到 10gb 的限制,这也感觉不是最理想的。

我是不是想多了,DynamoDB 可以很好地处理 100k 分区?

对于GSI需要查询整个集合的情况,是否有推荐的模式?

首先,如果您的 tables 没有 LSI,则单个项目集(分区键)的大小没有限制。如果 table 有 LSI,则 limit for one item set is 10GB。这不要与最大为 10GB 的逻辑分区混淆。

为了回答您的问题,我们确实需要有关 GSI 访问模式的更多信息。

使用具有单个分区的 GSI 来排序数据,然后在该 GSI 上使用扫描来获取所有数据,或者可能是前 N 项,这没有错。也就是说,如果您正在扫描 GSI,您可能只想扫描基数 table,这可能比创建 GSI 更便宜。请注意,Scan 实际上可能相当快,请确保您使用并行扫描并将线程数设置为等于 table 中数据的 MB 数。它们很昂贵,因为它们为 table 中的每个项目消耗 RCU。

但是,如果您打算查询数据并说 'Give me the data between X date and Y date',您的方法可能并不好。该查询可能会非常慢,因为查询不像扫描那样具有并行处理。

相反,您可能需要考虑 time-series pattern。基本上,您创建一个带有日期块的字段(假设像 2020-10-13 这样的一天)并将其作为分区键。现在您可以使用一系列查询获取您需要的数据,一个用于您日期范围内的每一天。

time-series 原则,即从连续范围键中提取数据块,可以应用于任何连续数据,而不仅仅是时间。

简而言之,如果您打算使用单个分区键查询 GSI,请三思。如果您计划使用单个分区键扫描 GSI,那可能没问题。