top of page
検索
  • 執筆者の写真m o

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

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


参考

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

最新記事

すべて表示

Quick Sightの分析のクロスアカウントコピー

はじめに 今回のブログではQuick Sightで作成した分析をクロスアカウントコピーするための方法を紹介します。 開発環境で作成した分析を本番環境にコピーしたい時などにこの方法が使えるのではないかと思います。 2024/07/12追記 QuickSightでアセット(データセット・分析・ダッシュボードなど)を管理する機能が追加されました。この機能を使って、アセットを複製する記事はこちらで紹介され

Amazon Redshiftのクエリがなぜかたまに遅くなる原因

始めに 弊社では、膨大なデータの夜間バッチ処理にRedshiftを採用しています。 適材適所でサービスを選択しており、夜間以外はお役御免で停止しておき、費用面を抑えるよう工夫しています。 メンテナンスウィンドウも設けて運用していて概ね問題なく稼働しています。 しかし、稀に全体的にクエリが遅くなってしまう謎の事象に悩まされていました。 今回この事象の原因を突き止めたので、その内容を共有したいと思いま

Commentaires


bottom of page