8章:データの変更
3.更新
結論
UPDATE分は実質 DELETE + INSERT
インデックスに影響する列を更新すると、その分だけコストが増える。
最適化の本質は、「更新する列を最小限にすること」
UPDATEの本質
UPDATEは単純な上書きではない。
インデックス的にはこうなる。
- 古いエントリを削除(DELETE)
- 新しいエントリを追加(INSERT)
インデックス上では位置が変わるため作り直しになる。
なぜ遅くなるのか
インデックスは順序を持っているため
- 値が変わる
→ 位置が変わる
→ 入れ替えが必要
その結果
インデックス上では、位置が変わるため作りなおしになる
インデックスとの関係
UPDATE分は「影響するインデックスだけ更新される」
ケース1:全列更新
- すべてのインデックスに影響
- インデックス数に比例して遅くなる
ケース2:一部列のみ更新
- 該当するインデックスだけ更新
- 他のインデックスは無関係
➡ インデックスが多くても影響は小さい
➡ UPDATEのコストは、「更新対象の列 × インデックス数」 できまる。
よくある罠(ORM)
ORMを使うと全列UPDATEが発行されることがある。
そのため、
- 不要なインデックス更新が発生
- パフォーマンス悪化
が発生する可能性がある。
対策:
- 更新対象の列を明示する
- ORMの生成SQLを確認する(ログ確認)
まとめ
- UPDATEはDELETE + INSERTと同じ
- インデックス更新がコストの本体
- 影響するインデックスだけ更新される
- 無駄な列更新はパフォーマンス悪化
ポイント:UPDATEは「どの列を変えるか」で速さが変わる