J-D*_*q87 2 amazon-dynamodb dynamodb-queries amazon-dynamodb-index
我们有一个 Dynamodb 表,Events其中包含大约 5000 万条记录,如下所示:
{
"id": "1yp3Or0KrPUBIC",
"event_time": 1632934672534,
"attr1" : 1,
"attr2" : 2,
"attr3" : 3,
...
"attrN" : N,
}
Run Code Online (Sandbox Code Playgroud)
有Partition Key=id并且没有Sort Key。id除了(全局唯一)和 之外,可以有数量可变的属性event_time,这是必需的。
此设置非常适合获取,id但现在我们希望有效地查询event_time并提取在该范围内匹配的记录的所有属性(可能是一百万或两个项目)。例如,标准将等于WHERE event_date between 1632934671000 and 1632934672000。
在不更改任何现有数据或通过外部过程转换数据的情况下,是否可以使用event_date和投影允许范围查询的所有属性来创建全局二级索引?根据我对 DynamoDB 的理解,这是不可能的,但也许还有我忽略的另一种配置。
提前致谢。
(编辑:我重写了答案,因为OP的评论澄清了要求是查询event_time范围忽略id。OP知道表设计并不理想,并试图充分利用糟糕的情况)。
是否可以使用 event_date 创建全局二级索引并投影可以允许范围查询的所有属性?
是的。您可以将全局二级索引添加到现有表并选择要投影的属性。您无法将 LSI 添加到现有表或更改表的主键。
不更改任何现有数据或通过外部流程对其进行转换?
不,您需要操纵属性。虽然任意范围查询不是它的强项,但 DynamoDB 具有可以适应您的查询模式的时间序列模式。
假设您主要在有限的天数内进行查询。您可以添加带有 PK(分区键)的 GSI yyyy-mm-dd。通过将时间戳与 id 连接起来的 SK(排序键)使行变得唯一event_time#id。PK 和 SK 一起构成索引的复合主键。
GSIPK1 = yyyy-mm-dd # 2022-01-20
GSISK1 = event_time#id # 1642709874551#1yp3Or0KrPUBIC
Run Code Online (Sandbox Code Playgroud)
查询单日需要 1 次查询操作,查询一个日历周范围需要 7 次查询操作。
GSI1PK = "2022-01-20" AND GSI1SK > ""
Run Code Online (Sandbox Code Playgroud)
添加SK条件查询一天内的范围 between:
GSI1PK = "2022-01-20" AND GSI1SK BETWEEN "1642709874" AND "16427098745"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2012 次 |
| 最近记录: |