为什么本地二级索引只允许用于散列和范围键(不仅仅是散列?)

Mon*_*key 5 amazon-dynamodb

在控制台中创建 DynamoDB 表时,如果选择哈希主键(而不是哈希和范围),为什么“本地二级索引”选项不可用?

我的用例是为每个用户存储一个活动提要,所以散列userid是合乎逻辑的。此外,我想保持本地二级索引范围,date_created以便我始终可以查询最近的 n 条记录。

我应该使用的主键uid,并date_created在此情况下(虽然在技术上这在理论上是可能的,两个项目将具有相同date_created

Jar*_*eld 5

使用全局二级索引。

首先,使用 DynamoDB 处理时间序列数据很困难,但并非不可能。听起来您想要一种在整个表中全局获取最新 date_created 记录的方法。在 DynamoDB 中考虑 GSI 的方式是它们就像它们自己的表一样,没有 HASH/RANGE 键组合是唯一的限制。

使用全局二级索引,您可以在任何其他字段上定义自己的哈希键和范围键,并且组合不需要是唯一的。您将希望哈希键类似于 'YYYY-MM'、'YYYY-MM-DD' 或 'YYYY-MM-DD-HH'(日期的第一部分),具体取决于记录的数量和类型您需要的性能。然后您将完整日期作为范围键并投影您需要的属性(越少越好,同样取决于用例)。我们将其分解的原因是为了避免数据库中的热停止。

现在,当您要查询最近的项目时,您首先需要知道要深入研究的日期的第一部分,然后查询将按排序顺序返回记录。

DynamoDB 之所以复杂,是因为它是一个基于 NoSQL 的系统。在幕后,随着数据大小和所需 IOPS 数量的增加,DynamoDB 会自动跨更多硬件水平分片数据。

我上面描述的方法可行,但如果您有非常大的数据大小或需要非常多的 IOPS(超过 1000 次写入),您可能需要考虑使用不同的技术。虽然 DynamoDB 允许您预置基本上无限制的读取和写入,但可以构建限制您的性能的 GSI,如下面的 DynamoDB 文档所述。

因此,要实现您为表预配的全部请求吞吐量,请保持您的工作负载在散列键值之间均匀分布。跨散列键值分布请求跨分区分布请求。