0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SQLパフォーマンス詳解 8章:データの変更_3.更新

0
Posted at

8章:データの変更

3.更新

結論

UPDATE分は実質 DELETE + INSERT
インデックスに影響する列を更新すると、その分だけコストが増える。
最適化の本質は、「更新する列を最小限にすること」


UPDATEの本質

UPDATEは単純な上書きではない。
インデックス的にはこうなる。

  • 古いエントリを削除(DELETE)
  • 新しいエントリを追加(INSERT)

インデックス上では位置が変わるため作り直しになる。


なぜ遅くなるのか

インデックスは順序を持っているため

  • 値が変わる
    → 位置が変わる
    → 入れ替えが必要

その結果
インデックス上では、位置が変わるため作りなおしになる


インデックスとの関係

UPDATE分は「影響するインデックスだけ更新される」

ケース1:全列更新

  • すべてのインデックスに影響
  • インデックス数に比例して遅くなる

ケース2:一部列のみ更新

  • 該当するインデックスだけ更新
  • 他のインデックスは無関係

➡ インデックスが多くても影響は小さい
➡ UPDATEのコストは、「更新対象の列 × インデックス数」 できまる。


よくある罠(ORM)

ORMを使うと全列UPDATEが発行されることがある。
そのため、

  • 不要なインデックス更新が発生
  • パフォーマンス悪化

が発生する可能性がある。

対策:

  • 更新対象の列を明示する
  • ORMの生成SQLを確認する(ログ確認)

まとめ

  • UPDATEはDELETE + INSERTと同じ
  • インデックス更新がコストの本体
  • 影響するインデックスだけ更新される
  • 無駄な列更新はパフォーマンス悪化

ポイント:UPDATEは「どの列を変えるか」で速さが変わる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?