8章:データの変更
1.挿入
結論
INSERTはインデックスの数だけ遅くなるため、
最適化の本質は、「インデックスを減らすこと」
INSERTでやっていること
INSERTはシンプルに見えて内部では2つのことをやっている。
- テーブルに行を追加
- インデックスをすべて更新
➡ ボトルネックは、インデックス更新
テーブル vs インデックスの違い
テーブル(ヒープ)
- 空いている場所に書くだけ
- 順序なし
- ほぼメモリ処理
➡ 速い
インデックス(Bツリー)
- 挿入位置が決まっている
- ツリーを探索するする必要あり
- 順序を維持する必要あり
➡ 遅い
なぜさらに遅くなるのか
インデックスは単純に追加するだけではない。
- リーフノードに空きがない → 分割
- 分割が上位ノードに波及
- 最悪ツリー全体に影響
➡ 1件INSERTでも遅くなる可能性あり
本質
INSERTのコスト = インデックス更新コスト
- インデックス1個 → その分だけ処理追加
- 複数ある → その回数分繰り返し
➡ 「数がそのままコスト倍率」
実務での考え方
- インデックスは必要最小限
- 冗長なインデックスはNG
➡ 読み取り性能とのトレードオフ
大量データ挿入時テクニック
大量データを挿入する場合は、以下のようにする。
- インデックス削除
- INSERT実行
- インデックス再作成
➡ 圧倒的に高速になる。(DWHでよく使う)
まとめ
- INSERTはインデックスで遅くなる
- インデックス数 = コスト倍率
- インデックス再作成
➡ 原則:インデックスは「読むための最適化」、書き込みはその代償で遅くなる。