適切なスキーマ設定
DynamoDBは限られた範囲のクエリを効率よく処理できるがそれ以外はコストが掛かる。重要なクエリを安価に効率よく実行できるようなスキーマ設計が需要である。アプリケーションのユースケースを注意深く解析して、単一のテーブルで処理可能な構造とする。
スキーマを構成する上で確認すべき点は、データサイズ、データ形式、クエリ負荷である。
- 関連するデータをまとめる
- ソート順を決定する
- クエリを分散する
- グローバルセカンダリインデックスを使用する
パーティションキー
効率的なパーティションキーの設計とし、クエリを分散させる。ただし、一部のパーティションに負荷が偏った場合でも、アダプティブキャパシティが自動的に適用され、ある程度は影響を緩和することができる。
負荷を分散させるために、格納された値を元にパーティションキーにサフィックスを付加する手法も存在する。
キャパシティを上げた状態でOnDemand課金に切り替える
OnDemandを使用する場合は、バーストトラフィックに耐えれるように、まずキャパシティを上げた状態にしておき、それからOnDemand課金に変更する。ただし、課金体系への変更には制限があることから頻繁な変更はできないことに留意が必要。
大きな項目データは、圧縮するかS3に保存する
圧縮したバイナリデータを保存したり、S3に保存してこのオブジェクト識別子をDynamoDBに保存することができる。
時系列データは複数テーブルによる構成も検討する
時系列データの場合、当日データに書き込みや読み込みが偏り、ホットスポットが発生する。これを回避するために期間ごとにテーブルを分割して、バッチ処理で新しいテーブルの作成と新しいテーブルへの切り替えを行う。
クエリの最適化
Scanクエリはなるべく使わない
Scanは非常に低速でデータ数が大きくなると非効率となるので避ける。
条件付き書き込みやアトミックカウンターを使用する
複数が同時に更新する場合は、条件付き書き込みを使用する。