MENU

DynamoDBのGSIとLSI、「どのキーを変えるか」で整理したらスッキリした

Cognitoのユーザープールと、IDプール。認証と認可で整理したら混乱が消えたことを説明する画像

おはようございます、YASUです。

以前、DynamoDBのQueryとScanの違いを整理しましたが、DVAの模擬試験ではその先の「インデックス」「キャパシティ」「キャッシュ」まで問われます。ここがまたややこしかったので、今日はシンプルに3つだけ整理します。

目次

結論

覚えるのは3つだけでした。インデックスは「どのキーを変えるか」でGSIかLSIかが決まる。キャパシティは「アクセスが読めるか」でオンデマンドかプロビジョニングかが決まる。DAXは「読み取りが多い」ときだけ効く。この3つの判断軸で、迷いが一気に減りました。

そもそもインデックスは何のためにあるのか

DynamoDBのQueryは、パーティションキー(必要ならソートキーも)を指定して取得する仕組みでした。ということは、キーに入っていない属性で検索したくなった時、Scanに頼るしかなくなります。そこで「別の切り口の索引」を追加するのがセカンダリインデックスです。種類はGSIとLSIの2つあります。

GSIとLSI、たった1つの質問で決まる

最初は違いがごちゃごちゃして覚えられませんでしたが、「どのキーを変えるのか」という1つの質問で整理できました。

パーティションキーを変えたい       → GSI
パーティションキーは同じで、ソートキーだけ変えたい → LSI

具体例で考えると分かりやすかったです。注文テーブルが「ユーザーID(パーティションキー)×注文日時(ソートキー)」で作られているとします。

  • 「ユーザーごとの注文を、金額順に並べたい」→ ユーザーIDはそのままで並び順だけ変えたいので、LSI
  • 「ある商品を買ったユーザーを探したい」→ 商品IDという、まったく別の軸で検索したいので、GSI

GSIとLSI、試験で問われる違い

  • 作れるタイミング:GSIはテーブル作成後でも追加できる。LSIはテーブル作成時にしか作れない
  • 整合性:GSIは結果整合性のみ。LSIは強い整合性のある読み取りも使える
  • キャパシティ:GSIは専用の読み書きキャパシティを持つ。LSIはベーステーブルのキャパシティを共有する
  • 制限:LSIは1テーブルに最大5個、同じパーティションキーのデータ合計が10GBまで。GSIにはデータサイズの制限がない

制約が多いLSIは使いにくく、実務ではGSIが選ばれることが多いそうです。ただし試験では「作成後に追加したい」「強い整合性で読みたい」といった条件から、どちらを選ぶかが問われやすい印象でした。

見落としがちな落とし穴

調べていて驚いたのが、プロビジョニングモードで、GSIのキャパシティが足りないと、ベーステーブルへの書き込みまでスロットリング(流量制限)されてしまうという点です。索引を足しただけなのに本体の書き込みが詰まる、というのは、実務でも模擬試験でもひっかけになりそうです。

キャパシティモード:アクセスが読めるかどうか

DynamoDBには、読み書きの量を管理する2つのモードがあります。

  • オンデマンド:使った分だけ課金。アクセス量が読めない時、急に増減する時に向いている
  • プロビジョニング:あらかじめ読み書きの量を決めておく。アクセスパターンが予測できる時に、コストを抑えやすい

判断軸はシンプルで、「アクセスが読めないならオンデマンド、読めるならプロビジョニング」です。最初はオンデマンドで始めて、アクセスの傾向が見えてきたらプロビジョニングに切り替える、という進め方もできるとされています(ただし切り替えには、前回の変更から一定時間あける必要があります)。

DAX:DynamoDB専用の「キャッシュ置き場」

最後がDAX(DynamoDB Accelerator)です。DynamoDBの前に置くインメモリキャッシュで、よく読まれるデータをメモリに持っておくことで、読み取りの応答時間をミリ秒からマイクロ秒に縮められます。DynamoDB互換のAPIで動くので、既存のアプリのコードをほとんど変えずに導入できる点も特徴です。

ただし、何でも速くなるわけではありません。ここが試験で狙われそうなポイントでした。

  • 向いている:同じデータを何度も読む、読み取りが多いアプリ
  • 向いていない:書き込みが多いアプリ、常に最新の値を厳密に読みたいアプリ(強い整合性のある読み取りは、キャッシュされずDynamoDBに直接流れる)

「DynamoDB専用のキャッシュ」と覚えておけば、「読み取り性能を上げたい」という要件が出てきた時にDAXを思い出せそうです。

まとめ

  • インデックスは「どのキーを変えるか」で選ぶ。パーティションキーを変えるならGSI、ソートキーだけ変えるならLSI
  • GSIは後から追加でき独自のキャパシティを持つ。LSIは作成時のみで、強い整合性の読み取りに対応する
  • キャパシティは「アクセスが読めないならオンデマンド、読めるならプロビジョニング」
  • DAXは読み取りが多いアプリに効く。書き込みが多い場合や、強い整合性が必要な場合には向かない

前回のQuery/Scanの話と合わせて、DynamoDBの全体像がだいぶ繋がってきました。次の模擬試験で、ここがどう変わるか楽しみです。それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次