Indexing AWS DynamoDB v2:我需要备用查询的二级索引吗?

Indexing AWS DynamoDB v2:我需要备用查询的二级索引吗?,indexing,amazon-dynamodb,secondary-indexes,Indexing,Amazon Dynamodb,Secondary Indexes,我需要创建一个表,其中包含由连续运行的进程生成的数据片段。此过程生成包含两个必需组件的消息,其中包括:全局唯一的消息UUID和消息时间戳 这些消息稍后将由UUID检索 此外,我需要定期从该表中删除所有太旧的消息,即时间戳距离当前时间超过X的消息 我一直在阅读DynamoDB v2文档(例如),试图弄清楚如何组织我的表,以及是否需要辅助索引来搜索要删除的消息。我的问题可能有一个简单的答案,但我不知怎么搞糊涂了 那么,我是否应该创建一个表,以UUID作为散列,messageTimestamp作为范围

我需要创建一个表,其中包含由连续运行的进程生成的数据片段。此过程生成包含两个必需组件的消息,其中包括:全局唯一的消息UUID和消息时间戳

这些消息稍后将由UUID检索

此外,我需要定期从该表中删除所有太旧的消息,即时间戳距离当前时间超过X的消息

我一直在阅读DynamoDB v2文档(例如),试图弄清楚如何组织我的表,以及是否需要辅助索引来搜索要删除的消息。我的问题可能有一个简单的答案,但我不知怎么搞糊涂了

那么,我是否应该创建一个表,以UUID作为散列,messageTimestamp作为范围键(以及包含实际消息的“message”属性),然后不创建任何二级索引?在我看到的示例中,散列不是唯一的(例如,上面链接下的ForumName)。在我的例子中,散列是唯一的。我不确定这是否有什么不同


如果我使用所述的哈希和范围创建表,并且没有辅助索引,那么我如何查询特定时间范围内的所有消息,而不管它们的UUID是什么?

简而言之,您不能。所有DynamoDB查询都必须包含查询中的主哈希索引。也可以选择使用范围键和/或本地辅助索引。使用当前的DynamoDB功能,您将无法使用LSI作为主索引的替代方案。您也不能仅使用range键发出查询(您可以在AWS控制台中轻松地进行测试)


我能想到的一个(代价高昂的)解决方法是对表进行扫描,根据时间戳值添加过滤器,以便找出要删除的字段。请注意,过滤不会减少查询的已用容量,因为它将解析整个表。

我们也在努力解决这个问题。我们提出的最佳解决方案是创建第二个表来存储时间序列数据。为此:

1)使用日期加“bucket”id作为散列键
你可以只使用日期,但我猜今天的日期会变成一个“热门”键——一个书写频率过高的键。这可能会造成严重的瓶颈,因为特定DynamoDB分区的总吞吐量等于总配置吞吐量除以分区数-这意味着如果所有写入操作都是针对单个键(今天的键),并且吞吐量为每秒20次写入,那么就有20个分区,您的总吞吐量为每秒1次写入。超出此范围的任何请求都将被限制。情况不太好

bucket可以是1到n之间的随机数,其中n应该大于底层数据库使用的分区数。确定n当然有点棘手,因为Dynamo没有显示它使用了多少分区。但我们目前正在根据所发现的示例,使用200的上限。这个链接上的文字是我们想出这个方法的基础

2)将UUID用于范围键

3)通过对每天和每段时间发出查询来查询记录。 这可能看起来很乏味,但它比完全扫描更有效。另一种可能是使用弹性地图减少工作,但我自己还没有尝试过,所以说不出这有多容易/有效

我们自己还在想办法,所以我很想听听其他人的意见。我还发现本演示对思考如何最好地使用Dynamo非常有帮助:


-John

DynamoDB引入了全球二级指数,解决了这个问题。