top of page
検索

DynamoDBにグローバルセカンダリインデックス(GSI)を追加する方法

執筆者の写真: m om o

DynamoDBとは

AWSのDynamoDBは柔軟なNoSQLデータベースサービスです。

DynamoDBではキーの設定が重要です。

  • パーティションキー: 各レコードのユニークな識別子です。DynamoDBはこのキーを使用してデータをパーティションに分散させ、効率的なアクセスを実現します。

  • ソートキー: 任意で設定できる追加のキーで、パーティションキーと合わせてプライマリキーを形成します。ソートキーを使用することで、同じパーティションキーを持つアイテムの順序付けや範囲クエリが可能になります。


グローバルセカンダリインデックス(GSI)

GSIを使用することで、元のテーブルのパーティションキーとは異なる属性を新たなパーティションキー(またはソートキー)として設定し、データをクエリできます。


グローバルセカンダリインデックス(GSI)の利用例

DynamoDBのテーブルにおいて複数の特定のパーティションキーを持つアイテムを一度に取得する必要がある場合があります。たとえば、パーティションキーが「A」と「B」のアイテムを同時にクエリしたい場合には、グローバルセカンダリインデックスを使用すると簡単に取得することができます。


グローバルセカンダリインデックス(GSI)を追加する

ここでは、DynamoDBにGSIを追加する手順を説明します。

campany_cdとuser_idがPKであるuser_tableというテーブルに、ユーザーをグループ化して取得できるようにuser_group_idを追加し、インデックスを作ろうと思います。

既存のテーブルにインデックスを追加する

aws dynamodb create-table \
    --table-name user_table \
    --attribute-definitions AttributeName=company_id,AttributeType=S \
                            AttributeName=user_id,AttributeType=S \
                            AttributeName=user_group_id,AttributeType=S \
    --key-schema AttributeName=company_id,KeyType=HASH \
                 AttributeName=user_id,KeyType=RANGE \
    --global-secondary-indexes \
        "[
            {
                \"IndexName\": \"user_group_id_index\",
                \"KeySchema\": [{\"AttributeName\":\"user_group_id\",\"KeyType\":\"HASH\"},
                \"Projection\":{
                    \"ProjectionType\":\"ALL\",
                },
            }
        ]"
)

既存のテーブルにインデックスを追加する

aws dynamodb update-table \
    --table-name user_table \
    --attribute-definitions AttributeName=user_group_id,AttributeType=S  \
    --global-secondary-index-updates \
        "[
            {
                \"Create\": {
                    \"IndexName\": \"user_group_id_index\",
                    \"KeySchema\": [{\"AttributeName\":\"user_group_id\",\"KeyType\":\"HASH\"},
                    \"Projection\":{
                        \"ProjectionType\":\"ALL\",
                    }
                }
            }
        ]"

Cloud Formationで構築している場合

以下のように、GlobalSecondaryIndexesというフィールドを入力することで、インデックスを増やすことができます。

      AttributeDefinitions:
        - AttributeName: company_id
          AttributeType: S
        - AttributeName: user_id
          AttributeType: S
        - AttributeName: user_group_id
          AttributeType: S
      KeySchema:
        - AttributeName: company_id
          KeyType: HASH
        - AttributeName: user_id
          KeyType: RANGE
      GlobalSecondaryIndexes:
        - IndexName: user_group_id_index  ## インデックス名
          KeySchema:
            - AttributeName: user_group_id ## パーティションキーとして設定したいカラム
              KeyType: HASH
          Projection:
            ProjectionType: ALL ## ALL, KEYS_ONLY, INCLUDE が設定できます

注意点

プロジェクションの設定を適切に行わないと、不必要なコスト増加やパフォーマンス低下の恐れがあるようです。

ProjectionTypeがALLの場合、取得するデータは全ての列を取得できます。

KEYS_ONLYはテーブルのキー属性(パーティションキーとソートキー)のみ、INCLUDEは特定の非キー属性を含めることができる設定です。

ProjectionTypeを必要最小限の単位やスループットの設定をする、効率的なクエリの設計を行うなどの工夫が必要です。


参考

閲覧数:852回0件のコメント

最新記事

すべて表示

Lambda SnapStart(Python)使ってみた

Python および .NET 関数向けの AWS Lambda SnapStart の一般提供を開始 https://aws.amazon.com/jp/blogs/news/aws-lambda-snapstart-for-python-and-net-function...

Amazon Redshiftのクエリコンパイル問題に立ち向かう

はじめに 前回、Amazon Redshiftがたまに遅くなる事象について記事にしました。 対策については触れていなかったので今回は検討した案をいくつか書き記したいと思います。 問題点 Redshiftのバージョンアップによってクエリコンパイルが発生し、バージョンアップ後の...

コメント


  • Facebook

©Optarc,llc.

bottom of page