【问题标题】:How do I query DynamoDB when I want to consider the sort key but not the partition key?当我想考虑排序键而不考虑分区键时,如何查询 DynamoDB?
【发布时间】:2018-03-27 21:18:11
【问题描述】:

我不知道如何在 DynamoDB 中执行此操作。

我有一个表格,里面有类似这样的数据:

ID    Updated     other fields...

1200  2017-12-11              ...
1201  2018-02-05              ...
1205  2018-01-05              ...
1206  2018-01-11              ...
1210  2018-02-15              ...
1212  2018-02-10              ...

分区键是“ID”,我有一个排序键“更新”。

例如,我想检索更新大于“2018-02-01”的记录。

我不能单独查询“更新”,它会向Query condition missed key schema element: ID 抱怨。我理解这意味着什么,但我不确定如何正确执行此操作。

我尝试添加各种索引,然后在索引上进行查询,包括仅将“更新”字段作为分区键,但是我无法查询仅与分区键完全匹配的值范围.

那么,如何跨多个分区查询一个条件?

我可以使用扫描,但这可能很昂贵。我可以通过以某种方式对其进行索引来做到这一点吗?或者有没有办法做类似于不需要指定分区键的查询?

【问题讨论】:

  • 我开始认为使用唯一 ID 作为分区键是一个坏主意,将属于一起的项目分区几乎会更好,但是如果两条记录具有相同的 '更新的'字段,两个键合在一起不会是唯一的,一个记录会覆盖另一个?我想我对如何正确使用分区键感到很困惑。
  • 对分区键使用唯一 ID 通常是个好主意。它有助于可扩展性。分区键未排序,因此您需要除 Updated 之外的分区键。
  • 为了保证键的唯一性,考虑在更新后附加一个随机值。因此,您的数据将位于相同的位置,但独一无二:)

标签: amazon-dynamodb


【解决方案1】:

使用扫描

几乎每个使用 DynamoDB 的人似乎都担心扫描。在许多情况下,扫描都很好。你应该问自己的事情包括:我将拥有多少数据,它将如何随着时间的推移而增长,我需要多快完成扫描,这将花费多少 RCU?不要只是忽略扫描 - 做数学。

存档数据

如果您只需要访问最近的数据,请考虑删除或归档旧数据。通过将其从表中移除,您可以提高扫描性能。

按日期分区

如果您真的想使用查询,可以使用多种策略来提高表性能。例如,您可以拥有 YYYY-MM 的分区键和日期时间的排序键(低至纳秒)。这样,您可以在一次查询中检索整月的数据,同时仍然能够对特定日期范围进行排序。这种查询在您的应用程序中处理起来比扫描要复杂得多。构建表实际上取决于您的数据访问模式。

【讨论】:

  • 如果您使用过滤器扫描并丢弃大部分结果并每天这样做 1000 次,那么它很快加起来。
【解决方案2】:

很好的问题,不是很好的解决方案! :)

• 如果不以分区键为条件,您将无法进行查询。
• 您需要将Updated 列作为排序键,或者在表“模式”中,或者在索引中。如果它不再是排序键,您将无法有效地查询Updated > VALUE

所以你需要一个恒定的分区键和Updated 作为排序键。这是您的全球二级索引:
• PK:ConstantColumn
• SK:Updated

当然,您会失去一些可伸缩性,因为您的所有索引都将位于一个分区中,但使用 KEYS_ONLY 投影应该会给您足够的空间。

如果您真的需要更高的可伸缩性,请考虑使用 PK 值,例如 C0C1、...、Cn,遍历每个分区键的查询,然后合并结果(除法)。

【讨论】:

    【解决方案3】:

    我会考虑替代分区键。例如,如果您创建一个使用年份作为分区键、日期作为排序键的 GSI,您的业务逻辑会起作用吗?年月呢?

    您的查询编写起来会更复杂,因为您可能需要发出多个查询来覆盖超过 1 个分区来填充您的结果页面。

    但正如您所指出的,这比执行全表扫描便宜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多