

# DynamoDB でのセカンダリインデックスを使用したデータアクセス性の向上
<a name="SecondaryIndexes"></a>

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

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

**注記**  
また、テーブルを `Scan` するのと同じように、インデックスも `Scan` できます。  
セカンダリインデックススキャンオペレーションのクロスアカウントアクセスは、現在、[リソースベースのポリシー](access-control-resource-based.md)ではサポートされていません。

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

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

DynamoDB は、次の 2 種類のセカンダリインデックスをサポートしています。
+ **[グローバルセカンダリインデックス](GSI.html) — **パーティションキーおよびソートキーを持つインデックス。ベーステーブルのものとは異なる場合があります。このインデックスに関するクエリがすべてのパーティションにまたがり、ベーステーブル内のすべてのデータを対象とする可能性があるため、グローバルセカンダリインデックスは「グローバル」と見なされます。グローバルセカンダリインデックスは、ベーステーブルとは別に独自のパーティション領域に保存され、ベーステーブルとは別にスケーリングします。
+ **[ローカルセカンダリインデックス](LSI.html) — **パーティションキーはベーステーブルと同じで、ソートキーが異なるインデックス。ローカルセカンダリインデックスは、ローカルセカンダリインデックスのすべてのパーティションの範囲が同じパーティションキーバリューを持つベーステーブルのパーティションに限定されるという意味で「ローカル」です。

グローバルセカンダリインデックスとローカルセカンダリインデックスの比較については、この動画を参照してください。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/BkEu7zBWge8/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/BkEu7zBWge8)


**Topics**
+ [DynamoDB のグローバルセカンダリインデックスの使用](GSI.md)
+ [ローカルセカンダリインデックス](LSI.md)

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


****  

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

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

各セカンダリインデックスは、関連付けられているベーステーブルと同じ[テーブルクラス](HowItWorks.TableClasses.html)と[キャパシティモード](capacity-mode.md)を使用します。各セカンダリインデックスには、以下を指定する必要があります。
+ 作成するインデックスのタイプ – グローバルセカンダリインデックスまたはローカルセカンダリインデックスのいずれか。
+ インデックスの名前。インデックスの名前付けルールは、「[Amazon DynamoDB のクォータ](ServiceQuotas.md)」に示すようにテーブルの場合と同じです。名前は関連付けられているベーステーブルに対して一意である必要がありますが、別のベーステーブルに関連付けられているインデックスでも同じ名前を使用できます。
+ インデックスのキースキーマ。インデックスキースキーマの各属性は、型が `String`、`Number`、または `Binary` の最上位属性である必要があります。ドキュメントとセットを含むその他のデータ型は使用できません。キースキーマのその他の要件は、インデックスの種類によって異なります。
  + グローバルセカンダリインデックスの場合、パーティションキーはベーステーブルの任意のスカラー属性にすることができます。ソートキーはオプションです。このキーもベーステーブルの任意のスカラー属性にすることができます。
  + ローカルセカンダリインデックスの場合、パーティションキーは、ベーステーブルのパーティションキーと同じである必要があります。ソートキーは、非キーベーステーブル属性である必要があります。
+ ベーステーブルからインデックスに射影する追加の属性 (ある場合)。この属性は、すべてのインデックスに自動的に射影されるテーブルのキー属性とは別の属性です。スカラー、ドキュメント、およびセットを含む任意のデータ型の属性を射影できます。
+ インデックスのプロビジョニングされたスループット設定（必要な場合）:
  + グローバルセカンダリインデックスの場合、読み込み/書き込みキャパシティーユニット設定を指定する必要があります。このプロビジョニングされたスループット設定は、ベーステーブルの設定から独立しています。
  + ローカルセカンダリインデックスの場合、読み込み/書き込みキャパシティーユニット設定を指定する必要はありません。ローカルセカンダリインデックスに対する読み込み/書き込みオペレーションは、そのベーステーブルのプロビジョニングされたスループット設定から使用します。

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

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

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

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

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