DynamoDBを最大限活用するためのインデックス設計ポイント

はじめに

AWSが提供するNoSQLデータベースである Amazon DynamoDB は、高いスケーラビリティと低レイテンシを特徴としています。一方でRDBとは異なる設計思想を持つため、「どのようにデータを取得するか」を事前に考えた設計が非常に重要です。

その中核となるのが インデックスです。
本記事では、DynamoDBのインデックスの種類や仕組み、設計時の注意点について解説します。

プライマリキー

DynamoDBでは、以下2点のプライマリキーに基づく検索が基本です。

パーティションキー(Partition Key, PK)

必須のキーです。プライマリキーがPKのみの場合、重複させることはできません。

ソートキー(Sort Key, SK)

任意に登録できるキーです。プライマリキーがPKとSKで構成される場合、PK単体は重複しても構いませんが、PKとSK両方を重複させることはできません。

RDBと違い、DynamoDBではこのプライマリキー以外の属性で検索したい場合、インデックスを使わないと効率的なクエリはできません。
そのため、DynamoDBでは「後から自由に検索条件を増やす」というより、アクセスパターンを事前に定義し、それに合わせてインデックスを設計することが重要になります。

DynamoDBにおけるインデックス

DynamoDBには、主に以下の2種類のセカンダリインデックスがあります。

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

元のテーブルとは異なるPK・SKを持てるインデックスです。テーブル作成後でも追加・削除が可能であることが最大の特徴で、PK・SKを自由に定義し、別のアクセスパターンを実現できます。また、読み込み・書き込みキャパシティを個別に設定可能(オンデマンドでも可)です。

例:

PK: userId(ユーザーID)
SK: createdAt(作成日時)

上記のように構築されたユーザー情報を格納するテーブルについて、メールアドレス(email)で検索したいとします。この場合、

PK: email(メールアドレス)

このようにGSIを設計することで実現可能です。

ローカルセカンダリインデックス(Local Secondary Index, LSI)

PKはテーブルと同じで、SKだけを変更するインデックスです。テーブル作成時にのみ定義可能(後から追加不可)ですが、同じパーティション内で異なる並び順・検索条件を実現し、強い整合性のある読み取りが可能です。

例:

PK: userId(ユーザーID)
SK: createdAt(作成日時)

上記のように構築されたユーザー情報を格納するテーブルについて、同じユーザーのデータを作成日時ではなく更新日時(updatedAt)で並び変えたいとします。この場合、

PK: userId(ユーザーID)
SK: updatedAt(更新日時)

このようにLSIを設計することで実現可能です。

テーブル作成後から追加可能であり、高い柔軟性を持つことから多くのケースではGSIが使われますが、同一パーティション内での検索・並び替えが重要な場合はLSIが有効です。

インデックス設計で重要なポイント

アクセスパターンを先に定義する

DynamoDB設計の基本は、まず「どんな条件で、どんな単位のデータを取得したいか」を洗い出すことです。
インデックスはそのアクセスパターンを実現するための手段です。

必要な属性だけを投影する

インデックスには以下の投影設定があります。

  • KEYS_ONLY:キー属性のみ
  • INCLUDE:指定した属性のみ
  • ALL:全属性

不要な属性まで投影すると、ストレージコスト増加・書き込みコスト増加につながるため、必要最小限の属性に絞るのがポイントです。

インデックスの数を増やしすぎない

インデックスは便利ですが、

  • 書き込み時にすべてのインデックスが更新される
  • コストが増加する

というトレードオフがあります。そのため「とりあえず作る」のではなく、本当に必要なアクセスパターンだけに限定することが重要です。

まとめ

DynamoDBのインデックスは、クエリ性能と設計の良し悪しを左右する重要な要素です。

RDBのように後から柔軟にクエリを追加することは難しい一方で、
DynamoDBでは アクセスパターンを事前に明確にし、それに最適化したインデックスを設計することで、非常に高い性能とスケーラビリティを実現できます。

特に重要なのは、「どのようにデータを保存するか」ではなく、「どのようにデータを取得するか」から設計を始めることです。
この考え方を取り入れることで、DynamoDBの特性を活かしたシンプルかつスケーラブルなシステムを構築できます。