当我想要考虑排序键但不考虑分区键时,如何查询DynamoDB?

时间:2018-03-27 21:18:12

标签: amazon-dynamodb

我无法弄清楚如何在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',我的排序键是'Updated'。

我想检索Updated大于“2018-02-01”的记录,比如说。

我无法单独询问'已更新',它会向Query condition missed key schema element: ID抱怨。我理解这意味着什么,但我不确定如何正确地做到这一点。

我已经尝试添加各种索引,然后查询索引,包括只将'Updated'字段作为分区键,但是我无法查询一系列值,只是在分区键上完全匹配

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

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

3 个答案:

答案 0 :(得分:3)

使用扫描

几乎所有使用DynamoDB的人似乎都对扫描感到担忧。在许多情况下,扫描都很精细。你应该问自己的事情包括;我将拥有多少数据,它将如何随着时间的推移而增长,我需要多快才能完成扫描,这将花费多少RCU?不要只是解雇扫描 - 做数学。

存档数据

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

按日期分区

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

答案 1 :(得分:2)

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

•如果不对分区键进行调节,则无法进行查询 •您需要Updated列作为排序键,可以在表“schema”中,也可以在索引中。如果它不再是排序键,您将无法有效地查询Updated > VALUE

因此,您需要一个常量分区键,Updated作为排序键。这是您的全球二级指数:
•PK:ConstantColumn
•SK:Updated

当然,您将失去一些可伸缩性,因为您的所有索引都在一个分区中,但使用KEYS_ONLY投影可以为您提供足够的空间。

如果您确实需要更多可扩展性,请考虑使用PKC0,...,C1之类的Cn值,迭代查询每个分区键,然后合并结果(除以等)。

答案 2 :(得分:1)

我会考虑替代分区键。例如,如果您创建一个以年为分区键且日期为排序键的GSI,您的业务逻辑是否会起作用?年月怎么样?

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

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