为什么在使用 DynamoDB 查询时需要显式指定哪个全局二级索引?

问题描述 投票:0回答:1

我正在使用 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,
        }
ruby-on-rails amazon-dynamodb
1个回答
0
投票

DynamoDB 没有像关系数据库那样的查询优化器。您必须明确说明在运行时使用哪个索引。这确保了在运行时优化查询不会浪费时间。

© www.soinside.com 2019 - 2024. All rights reserved.