Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

セカンダリインデックスを使用したデータアクセス性の向上

Amazon DynamoDB は、プライマリキーの値を指定して、テーブルの項目への高速なアクセスを可能にします。しかし多くのアプリケーションでは、プライマリキー以外の属性を使って、データに効率的にアクセスできるようにセカンダリ(または代替)キーを 1 つ以上設定することで、メリットが得られることがあります。これに対応するために、1 つのテーブルで 1 つ以上のセカンダリインデックスを作成して、それらのインデックスに対して Query または Scan リクエストを実行することができます。

セカンダリインデックス は、テーブルからの属性のサブセットと、Query オペレーションをサポートする代替キーで構成されるデータ構造です。Query をテーブルで使用する場合と同じように、Query を使用してインデックスからデータを取得できます。テーブルには、複数の セカンダリインデックス を作成できます。これにより、アプリケーションは複数の異なるクエリパターンにアクセスできます。

注記

また、テーブルを Scan するのと同じように、インデックスも Scan できます。

すべてのセカンダリインデックスは完全に 1 つのテーブルに関連付けられ、そこからデータを取得します。これはインデックスのベーステーブルと呼ばれます。インデックスを作成する場合は、インデックスの代替キー (パーティションキーおよびソートキー) を定義します。ベーステーブルからインデックスに射影またはコピーする属性も定義します。DynamoDB は、これらの属性とベーステーブルからのプライマリキー属性をインデックスにコピーします。次に、テーブルに対してクエリまたはスキャンを実行する場合と同様に、インデックスに対してクエリまたはスキャンを実行します。

すべての セカンダリインデックス は、DynamoDB によって自動的に維持されます。ベーステーブルの項目を追加、変更、または削除すると、そのテーブルのインデックスも更新され、この変更が反映されます。

DynamoDB では、次の 2 種類の セカンダリインデックス をサポートしています。

  • Global secondary indexベーステーブルと異なるパーティションキーとソートキーを持つインデックス。グローバルセカンダリインデックスは、そのインデックスのクエリは、すべてのパーティションにわたって、ベーステーブルのすべてのデータを対象に実行できるので、「グローバル」と見なされます。

  • ローカルセカンダリインデックスベーステーブルと同じパーティションキーと、異なるソートキーを持つインデックス。local secondary index は、local secondary index のすべてのパーティションの範囲が、同じパーティションキーの値を持つベーステーブルパーティションに限定されるという意味で「ローカル」です。

使用するインデックスの種類を決定するときは、アプリケーションの要件を考慮する必要があります。次の表は、グローバルセカンダリインデックス と local secondary index の主な違いを示しています。

特徴 グローバルセカンダリインデックス ローカルセカンダリインデックス
キースキーマ グローバルセカンダリインデックスのプライマリキーはシンプル (パーティションキー) または複合 (パーティションキーとソートキー) のいずれかとすることができます。 local secondary indexのプライマリキーは複合 (パーティションキーとソートキー) である必要があります。
キーの属性 インデックスパーティションキーとソートキー (存在する場合) は、文字列、数値、またはバイナリ型の任意のベーステーブル属性とすることができます。 インデックスのパーティションキーは、ベーステーブルのパーティションキーと同じ属性です。ソートキーは、文字列、数値、またはバイナリ型の任意のベーステーブル属性とすることができます。
パーティションキー値ごとのサイズ制限 グローバルセカンダリインデックス にサイズ制限はありません。 パーティションキーの値ごとに、すべてのインデックス付き項目の合計サイズが、10 GB 以下である必要があります。
オンラインインデックスオペレーション Global secondary indexは、テーブルの作成と同時に作成できます。また、既存のテーブルに新しい グローバルセカンダリインデックス を追加したり、既存の グローバルセカンダリインデックス を削除したりできます。詳細については、「グローバルセカンダリインデックスの管理」を参照してください。 ローカルセカンダリインデックスは、テーブルの作成と同時に作成されます。既存のテーブルに local secondary index を追加したり、現在存在する local secondary index を削除したりすることはできません。
クエリとパーティション グローバルセカンダリインデックス では、すべてのパーティションでテーブル全体に対してクエリを実行できます。 local secondary indexでは、クエリのパーティションキー値で指定された 1 つのパーティションに対してクエリを実行できます。
読み込み整合性 グローバルセカンダリインデックス のクエリでは、結果整合性のみがサポートされます。 local secondary index のクエリを実行するとき、結果整合性または強い整合性のどちらかを選択できます。
プロビジョニングされたスループットの消費 各 グローバルセカンダリインデックス には、読み込みおよび書き込みアクティビティに対する独自のプロビジョニングされたスループット設定があります。グローバルセカンダリインデックスのクエリまたはスキャンでは、ベーステーブルからではなく、インデックスからキャパシティーユニットを消費します。同じことが、テーブルへの書き込みによる グローバルセカンダリインデックス の更新にも当てはまります。 local secondary indexのクエリまたはスキャンでは、ベーステーブルから読み込みキャパシティーユニットを消費します。テーブルに書き込むと、そのlocal secondary indexも更新されます。この更新では、ベーステーブルから書き込みキャパシティーユニットを消費します。
射影される属性 グローバルセカンダリインデックス クエリまたはスキャンでは、インデックスに射影された属性だけをリクエストできます。DynamoDB は、テーブルから属性をフェッチしません。 local secondary index をクエリまたはスキャンする場合、インデックスに射影されていない属性をリクエストできます。DynamoDB は、テーブルからそれらの属性を自動的にフェッチしません。

セカンダリインデックス を持つテーブルを複数作成する場合は、連続的に作成する必要があります。たとえば、最初のテーブルを作成し、そのテーブルが ACTIVE になるまで待ちます。次のテーブルを作成し、そのテーブルが ACTIVE になるまで待ちます。セカンダリインデックス を持つ複数のテーブルを同時に作成しようとすると、DynamoDB は LimitExceededException を返します。

各 セカンダリインデックス には、以下を指定する必要があります。

  • 作成するインデックスの種類 – グローバルセカンダリインデックス または local secondary index。

  • インデックスの名前。インデックスの名前付けルールは、「DynamoDB での制限」に示すようにテーブルの場合と同じです。名前は関連付けられているベーステーブルに対して一意である必要がありますが、別のベーステーブルに関連付けられているインデックスでも同じ名前を使用できます。

  • インデックスのキースキーマ。インデックスキースキーマの各属性は、型が String、Number、または Binary の最上位属性である必要があります。ドキュメントとセットを含むその他のデータ型は使用できません。キースキーマのその他の要件は、インデックスの種類によって異なります。

    • グローバルセカンダリインデックスの場合、パーティションキーはベーステーブルの任意のスカラー属性にすることができます。ソートキーはオプションです。このキーもベーステーブルの任意のスカラー属性にすることができます。

    • local secondary indexの場合、パーティションキーは、ベーステーブルのパーティションキーと同じである必要があります。ソートキーは、非キーベーステーブル属性である必要があります。

  • ベーステーブルからインデックスに射影する追加の属性 (ある場合)。この属性は、すべてのインデックスに自動的に射影されるテーブルのキー属性とは別の属性です。スカラー、ドキュメント、およびセットを含む任意のデータ型の属性を射影できます。

  • インデックスのプロビジョニングされたスループット設定(必要な場合):

    • グローバルセカンダリインデックス の場合、読み込みおよび書き込みキャパシティーユニット設定を指定する必要があります。このプロビジョニングされたスループット設定は、ベーステーブルの設定から独立しています。

    • local secondary index の場合、読み込みおよび書き込みキャパシティーユニット設定を指定する必要はありません。local secondary indexに対する読み込みおよび書き込みオペレーションは、そのベーステーブルのプロビジョニングされたスループット設定から消費します。

クエリで最大の柔軟性を得るには、1 テーブルあたり最大 5 個の グローバルセカンダリインデックス および最大 5 個の local secondary index を作成できます。限定された数の GSI で複数のアプリケーションアクセスパターンを満たす方法を示す例については、GSI オーバーロードの設計ガイダンスを参照してください。

テーブルの セカンダリインデックス の詳細なリストを取得するには、DescribeTable オペレーションを使用します。DescribeTable は、テーブルのすべての セカンダリインデックス の名前、ストレージサイズ、および項目数を返します。これらの値はリアルタイムでは更新されませんが、約 6 時間ごとに更新されます。

セカンダリインデックス のデータには、Query または Scan オペレーションを使用してアクセスできます。使用するベーステーブル名とインデックス名、結果で返される属性、および適用する条件式またはフィルタを指定する必要があります。DynamoDB で返される結果は、昇順にも降順にもすることができます。

テーブルを削除すると、そのテーブルに関連付けられているすべてのインデックスも削除されます。

ベストプラクティスについては、DynamoDB でセカンダリインデックスを使用するためのベストプラクティス を参照してください。