DynamoDB で GSI/LSI は後からつけることは可能?DynamoDB のインデックスの追加を解説します😎!

DynamoDB で GSI/LSI は後からつけることは可能?DynamoDB のインデックスの追加を解説します😎!

想定する読者

  • DynamoDB の設計をしている人
  • DynamoDB でアプリケーション開発をしている人

はじめに

DynamoDB は、事前にデータアクセスを行う関係で、後からインデックスを貼り付けたくなるシーンが多いと思います。

実際に AWS へ質問してみたので、その回答を交え解説します!

結論:GSI は後から追加可能、LSI は後から追加不可

Global secondary index(GSI) は既存のテーブルに追加することが可能、一方でlocal secondary index(LSI)はテーブルの作成時のみに作成が可能となっております。

セカンダリインデックスについてのドキュメント

AWS の公式サイトへ記載があります。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SecondaryIndexes.html

上記のドキュメントの通り、GSI はテーブルの作成と同時に作成可能であり、かつ既存テーブルに新しい GSI を追加したり、既存の GSI を削除することも可能です。

対して LSI は、テーブル作成と同時に作成されますが、既存のテーブルに追加したり、存在する LSI を削除したりすることはできません。なので、LSI の貼り付けはテーブル作成時の一度きりと言えるでしょう。

既存のテーブルへGSIを追加したときの挙動

GSI 作成時の各属性については、DynamoDB プロビジョニング時の、Projection:ProjectionType の設定に基づいて射影されます。

KEYS_ONLY の場合は、インデックスに指定したキー情報のみ射影されますし、INCLUDE であれば NonKeyAttributes に指定したキー情報が射影されるといった挙動です。( 逆にインデックスキーの属性が存在しない、空文字などは GSI に挿入されません )

この辺りは、GSIのドキュメント をきちんと確認してから開発を行いましょう。

まとめ

DynamoDB は後から GSI の作成が可能なので、新たな検索要件が発生してもある程度の柔軟対応が可能です。

ただし、そもそも最初の設計がミスっていれば、後から GSI が追加可能だとしてもすぐに限界がきます。( 新たにテーブルもう一つ作成しないと・・といった状況になりかねないです )

最初の設計は経験値のある人に任せるなど、慎重に行いましょう。