Amazon dynamodb Dynamodb:如何高效地查询主键组中的行数?
我有一个dynamoDB表,它存储了数百万个事件 该表有一个主键和一个排序键:Amazon dynamodb Dynamodb:如何高效地查询主键组中的行数?,amazon-dynamodb,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
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
在伪代码中,我想查询如下内容:
createdAt中用户ID的记录数:3746241188984046<
2017-04-19T00:00:00.000000001Z和createdAt>
2017-04-16T00:00:00.000000001Z
返回类似于他的结果:
{
374624 => 2,
4046 => 3,
118898 => 0
}
如何使用dynamoDB有效地完成这项工作?我可以创建一个索引,让我更容易做到这一点吗?
如果我需要为1000个用户ID这么做怎么办?DyanmoDB基本上提供了两种访问数据的方法。可以通过散列(分区)键访问数据,因此速度很快。若使用查询,则必须指定一个且只能指定一个哈希键,这意味着您只能通过一个查询从一个分区检索数据。您可以选择指定其他参数以缩小分区内的结果范围。例如,您可以为排序键提供一个范围 关键字条件表达式 指定键值的条件 对于要由查询操作检索的项 该条件必须对单个分区键执行相等测试 价值观 条件可以选择执行几个比较测试之一 在单个排序键值上。这允许查询检索一个项目 具有给定的分区键值和排序键值,或若干项 具有相同分区键值但不同排序键值的 分区键相等测试是必需的,必须在中指定 以下格式: partitionKeyName=:partitionkeyval 其他选择是。扫描总是对表中的每个项目进行评估,因此通常速度较慢,并且不能很好地扩展。使用扫描,您可以在一次通话中获取数据,但效率低下 总之,您应该进行大量的查询调用,其中每个调用都有一个哈希键,并且每个查询中的条件都相同。然后将所有结果合并到一个列表中
编辑:您可以使用按其(复合)主键检索一个项目。您可以使用一次检索多个项目。但不幸的是,没有BatchQuery。将每个用户ID作为关键条件进行查询,并按排序键进行筛选,仅对用户ID进行投影,dynamodb上的每个查询返回一个计数:
这是处理此表结构最有效的方法。因此,遗憾的是,我无法处理dynamo db。你能想出任何方法,我可以通过制作替代索引或其他东西来更有效地实现这一点吗?你肯定可以在DynamoDB中实现这一点。您只需要将范围键和分区键传递给一个定制函数,该函数将遍历键并对每个键进行查询,然后将结果添加到一个列表中并返回该列表。代码不多。但是没有,没有办法在一次呼叫中完成(除了扫描,这可能很慢而且很昂贵)。我不认为有任何快速的解决方法-DynamoDB只是不打算像SQL那样强大。如果使用正确,在很多情况下它会更快。你能看到其他的结构化或索引方法吗?这些方法可以提高性能(我真的不想发出1k请求:-)