二级索引上的 Dynamo DB 查询

Dynamo DB queries on Secondary Index

我有一个用例,我每天多次获取某些项目(唯一项目 ID)的数据(由 day_BatchTime 标识)并将它们存储在 DyanmoDB 中。我的复合主键由 itemID 和 day_BatchTime 组成。我已将 itemID 设置为分区键,将 day_BatchTime 设置为排序键。

但我需要每天报告每一天。所以我尝试将全局二级索引设置为 feedDate。但是在 AWS 控制台中对此进行查询的速度有点慢。此外,使用 Python 在 lambda 中执行以下查询时出现错误。以下是相关片段:

response = table.query(KeyConditionExpression=Key('feedDate').eq('18-03-2022'))

"errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: itemID"

table 有大约 53,000 个项目,全球二级索引填充了大约 31,000 个项目,我正在查询每天更新的大约 6000 个项目。与通常预期的相比,查询执行时间似乎要长得多。

以下是我的全局二级索引详细信息。

如果我遗漏了什么,请告诉我。

正如@hoangdv 在评论中指出的那样,您忘记将索引名称添加到查询中。默认情况下,Query 从基 table 读取,因此您需要显式将其指向全局二级索引。

像这样应该可以解决问题:

response = table.query(
    IndexName="feedDate-index",
    KeyConditionExpression=Key('feedDate').eq('18-03-2022')
)

关于您认为的性能问题,如果没有具体的数字和数据,这些问题很难解决。一般来说,Query API returns 每个 API 调用最多 1000 个项目或 1MB 数据,然后 follow-up API 调用需要使用分页令牌 (ExclusiveStartKey) 执行。您正在查看至少 6 个后续 API 调用以获取您的 6000 件商品。

查询的来源和数据的复杂性也可能影响性能。例如,与具有更高性能的函数相比,具有 128 MB RAM 的微型 Lambda 函数将花费更长的时间来反序列化项目。如果你好奇的话,我刚才写了一篇关于这个话题的blog(免责声明:我写的,与主题相关)。