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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

注記

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

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

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

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

  • グローバルセカンダリインデックスベーステーブルと異なるパーティションキーとソートキーを持つインデックス。グローバルセカンダリインデックスは、このインデックスに関するクエリが、すべてのパーティションにまたがり、ベーステーブル内のすべてのデータを対象とする可能性があるため、「グローバル」と見なされます。グローバルセカンダリインデックスは、ベーステーブルとは別に独自のパーティション領域に保存され、ベーステーブルとは別にスケーリングします。

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

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

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

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

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

  • 作成するインデックスのタイプ。グローバルセカンダリインデックスまたはローカルセカンダリインデックスのいずれか。

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

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

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

    • ローカルセカンダリインデックスの場合、パーティションキーは、ベーステーブルのパーティションキーと同じである必要があります。ソートキーは、非キーベーステーブル属性である必要があります。

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

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

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

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

最大限のクエリの柔軟性を得るために、テーブルごとに最大 20 個のグローバルセカンダリインデックス (デフォルトのクォータ) および最大個のローカルセカンダリインデックスを作成できます。

テーブルあたりのグローバルセカンダリインデックスのクォータは、次の AWS リージョンでは 5 です。

  • AWS GovCloud (米国東部)

  • AWS GovCloud (米国西部)

  • 欧州 (ストックホルム)

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

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

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

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