我正在使用 Aws::DynamoDB::Client 对表执行查询。我定义了多个全局二级索引,其中之一使用
user-id
和 recorded_at
。
当我使用以下查询参数运行查询时:
dynamo_query = {
expression_attribute_values: {
":l1" => start_time.to_i,
":l2" => end_time.to_i,
":u1" => user_id
},
key_condition_expression: "user_id = :u1 AND recorded_at BETWEEN :l1 AND :l2",
table_name: table_name,
limit: 50,
}
它抱怨查询条件缺少关键架构元素:company_id
只有当我在查询中显式指定全局二级索引名称时,它才有效:
dynamo_query = {
expression_attribute_values: {
":l1" => start_time.to_i,
":l2" => end_time.to_i,
":u1" => user_id
},
key_condition_expression: "user_id = :u1 AND recorded_at BETWEEN :l1 AND :l2",
table_name: table_name,
index_name: 'UserIdRecordedAtIndex',
limit: 50,
}
为什么会这样? Dynamo 不应该根据传递的查询参数自动选择正确的 GSI 吗?
只有当我在查询中显式指定全局二级索引名称时,它才有效:
dynamo_query = {
expression_attribute_values: {
":l1" => start_time.to_i,
":l2" => end_time.to_i,
":u1" => user_id
},
key_condition_expression: "user_id = :u1 AND recorded_at BETWEEN :l1 AND :l2",
table_name: table_name,
index_name: 'UserIdRecordedAtIndex',
limit: 50,
}
DynamoDB 没有像关系数据库那样的查询优化器。您必须明确说明在运行时使用哪个索引。这确保了在运行时优化查询不会浪费时间。