ライトアンプリフィケーション
データベースへの 1 回の論理的な書き込みが、内部的に複数回の物理的な書き込みを引き起こす現象
データベースパフォーマンス
ライトアンプリフィケーションとは
ライトアンプリフィケーション (Write Amplification) は、アプリケーションが 1 回の論理的な書き込みを行った際に、データベースやストレージが内部的に複数回の物理的な書き込みを行う現象である。書き込み増幅率 (WAF) が高いほど、書き込み性能が低下し、SSD の寿命が短くなる。
WAF = 物理的な書き込み量 / 論理的な書き込み量
例: 1KB のデータを書き込むのに、内部的に 10KB の書き込みが発生
WAF = 10KB / 1KB = 10
発生する場面
RDB のインデックス更新
1 行を INSERT すると、テーブル本体 + 全インデックスに書き込みが発生する。インデックスが 5 つあれば、1 回の INSERT で 6 回の書き込みが発生する。
-- テーブルにインデックスが 5 つある場合
INSERT INTO orders (id, user_id, status, created_at, total)
VALUES ('ord-1', 'user-1', 'pending', NOW(), 5000);
-- 物理的な書き込み: テーブル + 5 インデックス = 6 回
LSM-Tree (DynamoDB, Cassandra)
LSM-Tree ベースのデータベースでは、データがメモリ (MemTable) → ディスク (SSTable) に書き出され、バックグラウンドでコンパクション (マージ) が実行される。コンパクションのたびにデータが再書き込みされるため、WAF が高くなる。
書き込み → MemTable → SSTable L0 → コンパクション → SSTable L1 → コンパクション → SSTable L2
↑ 再書き込み ↑ 再書き込み
SSD のガベージコレクション
SSD はページ単位 (4KB) で書き込み、ブロック単位 (256KB〜) で消去する。1 ページを更新するために、ブロック全体を読み出し → 更新 → 別ブロックに書き込む必要がある。
DynamoDB での影響
DynamoDB は LSM-Tree ベースで、以下の要因で WAF が増加する。
- GSI (Global Secondary Index): 各 GSI への書き込みが追加で発生
- アイテムサイズ: 1KB 未満のアイテムでも 1KB 単位で課金 (WCU)
- コンパクション: バックグラウンドで自動実行
GSI を 3 つ持つテーブルに 1 アイテムを書き込むと、テーブル + 3 GSI = 4 WCU が消費される。
WAF を低減する方法
| 対策 | 効果 |
|---|---|
| インデックスを最小限にする | インデックス更新の書き込みを削減 |
| バッチ書き込み | 個別書き込みより効率的 |
| 適切なパーティションキー設計 | ホットパーティションを回避 |
| 書き込みバッファリング | 小さな書き込みをまとめる |
読み取りアンプリフィケーションとのトレードオフ
インデックスを減らすと WAF は下がるが、読み取り時にフルスキャンが必要になり、読み取りアンプリフィケーション (Read Amplification) が増加する。書き込み頻度と読み取り頻度のバランスでインデックス数を決定する。
より深く学ぶには関連書籍が役立つ。