使用毫秒时间戳作为 DynamodDb 中的全局二级索引进行范围查询?
Using millisecond timestamp as the global secondary index in DynamodDb for range queries?
我们有一个 Dynamodb table Events
大约有 5000 万条记录,如下所示:
{
"id": "1yp3Or0KrPUBIC",
"event_time": 1632934672534,
"attr1" : 1,
"attr2" : 2,
"attr3" : 3,
...
"attrN" : N,
}
有Partition Key=id
而没有Sort Key
。除了必需的 id
(全局唯一)和 event_time
之外,可以有可变数量的属性。
此设置适用于 id
的抓取,但现在我们想要 高效地 查询 event_time
并提取匹配记录的所有属性在该范围内(可能是一百万或两个项目)。例如,条件等于 WHERE event_date between 1632934671000 and 1632934672000
。
在不更改任何现有数据或通过外部流程转换数据的情况下,是否可以使用 event_date
创建全局二级索引并投影所有允许范围查询的属性?根据我对 DynamoDB 的理解,这是不可能的,但也许我忽略了另一种配置。
提前致谢。
似乎可以随时创建全局二级索引。
以下是管理全球二级索引文档的节选,可在此处找到 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.html
要将全局二级索引添加到现有 table,请使用带有 GlobalSecondaryIndexUpdates 参数的 UpdateTable 操作。
(编辑:我重写了答案,因为 OP 的评论澄清了要求是查询 event_time
范围而忽略 id
。OP 知道 table 设计并不理想并且是努力在糟糕的情况下做到最好)。
Is it possible to create a Global Secondary Index using event_date and projecting ALL attributes that could allow a range query?
是的。您可以添加一个全局二级索引 to an existing table and choose which attributes to project。您不能将 LSI 添加到现有 table 或更改 table 的主键。
Without changing any existing data or transforming it through an external process?
没有。您将需要操纵属性。虽然任意范围查询不是它的强项,但 DynamoDB 有一个 time series pattern 可以适应你的查询模式。
假设您主要在有限的天数内进行查询。您将使用 yyyy-mm-dd
PK(分区键)添加 GSI。行通过 SK(排序键)将时间戳与 id 连接起来而变得唯一:event_time#id
。 PK和SK一起就是Index的Composite Primary Key.
GSIPK1 = yyyy-mm-dd # 2022-01-20
GSISK1 = event_time#id # 1642709874551#1yp3Or0KrPUBIC
查询一天需要 1 个查询操作,一个日历周范围需要 7 个操作。
GSI1PK = "2022-01-20" AND GSI1SK > ""
通过添加SKbetween
条件查询一天内范围:
GSI1PK = "2022-01-20" AND GSI1SK BETWEEN "1642709874" AND "16427098745"
我们有一个 Dynamodb table Events
大约有 5000 万条记录,如下所示:
{
"id": "1yp3Or0KrPUBIC",
"event_time": 1632934672534,
"attr1" : 1,
"attr2" : 2,
"attr3" : 3,
...
"attrN" : N,
}
有Partition Key=id
而没有Sort Key
。除了必需的 id
(全局唯一)和 event_time
之外,可以有可变数量的属性。
此设置适用于 id
的抓取,但现在我们想要 高效地 查询 event_time
并提取匹配记录的所有属性在该范围内(可能是一百万或两个项目)。例如,条件等于 WHERE event_date between 1632934671000 and 1632934672000
。
在不更改任何现有数据或通过外部流程转换数据的情况下,是否可以使用 event_date
创建全局二级索引并投影所有允许范围查询的属性?根据我对 DynamoDB 的理解,这是不可能的,但也许我忽略了另一种配置。
提前致谢。
似乎可以随时创建全局二级索引。
以下是管理全球二级索引文档的节选,可在此处找到 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.html
要将全局二级索引添加到现有 table,请使用带有 GlobalSecondaryIndexUpdates 参数的 UpdateTable 操作。
(编辑:我重写了答案,因为 OP 的评论澄清了要求是查询 event_time
范围而忽略 id
。OP 知道 table 设计并不理想并且是努力在糟糕的情况下做到最好)。
Is it possible to create a Global Secondary Index using event_date and projecting ALL attributes that could allow a range query?
是的。您可以添加一个全局二级索引 to an existing table and choose which attributes to project。您不能将 LSI 添加到现有 table 或更改 table 的主键。
Without changing any existing data or transforming it through an external process?
没有。您将需要操纵属性。虽然任意范围查询不是它的强项,但 DynamoDB 有一个 time series pattern 可以适应你的查询模式。
假设您主要在有限的天数内进行查询。您将使用 yyyy-mm-dd
PK(分区键)添加 GSI。行通过 SK(排序键)将时间戳与 id 连接起来而变得唯一:event_time#id
。 PK和SK一起就是Index的Composite Primary Key.
GSIPK1 = yyyy-mm-dd # 2022-01-20
GSISK1 = event_time#id # 1642709874551#1yp3Or0KrPUBIC
查询一天需要 1 个查询操作,一个日历周范围需要 7 个操作。
GSI1PK = "2022-01-20" AND GSI1SK > ""
通过添加SKbetween
条件查询一天内范围:
GSI1PK = "2022-01-20" AND GSI1SK BETWEEN "1642709874" AND "16427098745"