今日は、DynamoDBのGSIの仕組みについての日。
目次
とある日
AWSではじめる クラウド開発入門 を読んでいてDynamoDBのGSIについての挙動で興味深い内容がったので調べてみた。
DynamoDB GSIについて
パーティションキーおよびソートキーを持つインデックス。ベーステーブルのものとは異なる場合があります。このインデックスに関するクエリがすべてのパーティションにまたがり、ベーステーブル内のすべてのデータを対象とする可能性があるため、グローバルセカンダリインデックスは「グローバル」と見なされます。グローバルセカンダリインデックスは、ベーステーブルとは別に独自のパーティション領域に保存され、ベーステーブルとは別にスケーリングします。
要点
- グローバルセカンダリインデックスのプライマリキーはシンプル (パーティションキー) または複合 (パーティションキーとソートキー) のいずれかとすることができます。
- インデックスパーティションキーとソートキー (存在する場合) は、文字列、数値、またはバイナリ型の任意のベーステーブル属性とすることができます。
- グローバルセカンダリインデックスのサイズ制限はありません。
- グローバルセカンダリインデックスは、テーブルの作成と同時に作成できます。また、新しいグローバルセカンダリインデックスを既存のテーブルに追加したり、既存のグローバルセカンダリインデックスを削除したりすることもできます。
- グローバルセカンダリインデックスでは、すべてのパーティションでテーブル全体に対してクエリを実行できます。
- グローバルセカンダリインデックスのクエリは結果整合性をサポートします。
- 各グローバルセカンダリインデックスには、読み込み/書き込みアクティビティに対する独自のプロビジョニングされたスループット設定があります。グローバルセカンダリインデックスのクエリまたはスキャンでは、ベーステーブルからではなく、インデックスからキャパシティーユニットを使用します。同じことが、テーブルへの書き込みによるグローバルセカンダリインデックスの更新にも当てはまります。
- グローバルセカンダリインデックスのクエリまたはスキャンでは、インデックスに射影された属性のみをリクエストできます。DynamoDB では、テーブルから属性をフェッチしません。
DynamoDB GSIの仕組みについて
RDBのINDEXとは仕組みが全然違っています。
DynamoDBだと、ベーステーブルとは別にGSIを設定したテーブルがある模様です。
そのテーブルとベーステーブルは同期を取っているようです。
DynamoDB では、各グローバルセカンダリインデックスをそのベーステーブルと自動的に同期させています。アプリケーションがテーブルに項目を書き込むか、削除すると、そのテーブルのすべてのグローバルセカンダリインデックスは、結果整合性モデルを使用して、非同期で更新されます。アプリケーションがインデックスに直接書き込むことはありません。ただし、DynamoDB でこれらのインデックスがどのように維持されるかを理解することは重要です
同期を取っているため、GSIは結果整合性のみをサポートしています。
同期をとるため、テーブル作成後でもGSIを作成ができます。
〆
GSIの仕組みを考えると、LSIとGSIの違いについてもよく理解できるのではないでしょうか。
もっと詳細について調べてもあまり情報が出てこなかったです。
参考資料
DynamoDB のグローバルセカンダリインデックスの使用 - Amazon DynamoDB
ローカルセカンダリインデックス - Amazon DynamoDB
AmazonのDynamoDB論文を眺めた | Takuya Kitazawa
Dynamo: amazon's highly available key-value store: ACM SIGOPS Operating Systems Review: Vol 41, No 6