おはようございます、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の全体像がだいぶ繋がってきました。次の模擬試験で、ここがどう変わるか楽しみです。それでは、また明日!

コメント