2章:where句
6.インデックスの作り過ぎ
要点
-
過剰なインデックスは害が大きい:
読み取りは速くなるが、INSERT/UPDATE/DELETE のたびに全ての該当インデックスを更新するため書き込み性能と運用負荷が悪化する -
関数インデックスは増えやすい:
大文字・小文字対策などで同じ列に複数の関数インデックスを作ると冗長になりやすい -
一貫した方針を優先:
アプリ側で正規化(例:列を小文字で保存)して単一インデックスで済ませるのが最も効率的 -
冗長インデックスを避ける:
(a)と(a,b)のような重複は原則削除候補 -
運用で監視・整理する:
使用実績・EXPLAIN を基に未使用・低効果インデックスを定期的に削除する
短いSQL例
-- NG: 同列に複数作る(冗長)
CREATE INDEX idx_emp_last_lower ON employees (LOWER(last_name));
CREATE INDEX idx_emp_last_upper ON employees (UPPER(last_name));
-- 良: アプリで正規化して単一インデックス
-- (例:last_name_lc 列へ小文字を保存)
CREATE INDEX idx_emp_last_lc ON employees(last_name_lc);
まとめ
「使うクエリを知らずに片っ端からインデックスを作るな」。
実際のクエリ/統計を元に最小限で設計・監視するのが最短で安全。