Dynamodb:如何有效地查询主键组中的行数?

时间:2018-01-11 10:36:35

标签: amazon-dynamodb

我有一个存储数百万个事件的dynamoDB表

该表有一个主键和一个排序键:

Primary partition key   userID (Number)
Primary sort key    createdAt (String)

表格看起来像这样:

userID  createdAt                       someAttr
374624  2017-04-17T20:16:41.695884945Z  abc
374624  2017-04-16T22:13:12.611114945Z  abc
374624  2017-04-20T20:18:15.695874945Z  abc
4046    2017-04-15T20:12:01.695814945Z  abc
4046    2017-04-17T20:16:22.195684945Z  abc
118898  2017-04-19T20:11:42.695874945Z  abc
4046    2017-04-17T20:14:41.192884945Z  abc
118898  2017-04-14T20:17:18.695784945Z  abc
118898  2017-04-13T20:03:41.295484945Z  abc
4046    2017-04-18T20:22:32.395784945Z  abc
118898  2017-04-30T20:08:41.595814945Z  abc
118898  2017-04-20T20:15:52.695784945Z  abc

在伪代码中,我想查询类似的内容:

  

userIDs的记录数:374624,118888,4046 within createdAt<   2017-04-19T00:00:00.000000001Z AND createdAt>   2017-04-16T00:00:00.000000001Z

返回像他一样的结果:

{
  374624 => 2,
  4046 => 3,
  118898 => 0
}

如何使用dynamoDB高效地完成此操作?我可以创建一个能让我更容易做到的索引吗? 如果我需要为1000个用户ID执行该怎么办?

2 个答案:

答案 0 :(得分:1)

DyanmoDB本质上提供了两种访问数据的方法。 Query可用于通过哈希(分区)密钥访问数据,因此速度很快。如果使用查询,则必须指定一个且仅指定一个哈希键,这意味着您只能通过一个查询从一个分区中检索数据。您可以选择指定其他参数以缩小分区内的结果范围。例如,您可以为排序键提供范围。

  

KeyConditionExpression

     

指定键值的条件   查询操作要检索的项目。

     

条件必须对单个分区键执行相等性测试   值。

     

条件可以选择执行多个比较测试之一   在单个排序键值上。这允许Query检索一个项目   具有给定的分区键值和排序键值,或多个项目   具有相同分区键值但具有不同排序键值的值。

     

需要分区键相等性测试,并且必须在中指定   格式如下:

     

partitionKeyName =:partitionkeyval

其他选项是Scan.。扫描总是评估表中的每个项目,因此它通常很慢并且不能很好地扩展。使用扫描,您可以在一次通话中获取数据,但效率很低。

总而言之,您应该进行大量的Query调用,其中每个调用都有一个哈希键,并且每个Query中的条件都相同。然后将所有结果合并到一个列表中。

编辑:您可以使用GetItem通过其(复合)主键检索一个项目。您可以使用BatchGetItem一次检索多个项目。但遗憾的是没有BatchQuery。

答案 1 :(得分:1)

查询每个userId作为您的关键条件,并按排序键过滤,仅针对您的userIds投影,每个Dynamodb上的查询返回一个计数:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Count 对于您希望对此表结构执行的操作,这是最有效的方法。