【いんでっくすせんりゃく】

インデックス戦略 とは?

💡 本の索引を設計する技術。多すぎても少なすぎてもダメ
📌 このページのポイント
インデックス戦略:選択と設計のポイント ①クエリ分析 WHERE / JOIN の 頻出パターンを確認 ②カーディナリティ確認 高: user_id など 低: status(3種類)など ③EXPLAIN で検証 実行計画でインデックスが 使われているか確認 インデックスの種類と使い分け B-treeインデックス 範囲検索・等値検索 デフォルト。用途が広い ハッシュインデックス 等値検索のみ高速 範囲検索は不可 複合インデックス 列順が重要 絞り込み力が強い列を先頭へ トレードオフ:インデックスを増やすほど書き込みが遅くなりストレージが増える 読み取り速度 vs 書き込みコスト を常に意識して設計する
インデックス戦略はクエリ分析→カーディナリティ確認→EXPLAINで検証するサイクルで最適化する
ひよこ ひよこ

インデックス戦略って、インデックスをたくさん張ればいいんじゃないの?

ペンギン先生 ペンギン先生

それが落とし穴でね、インデックスを増やすほど検索は速くなるけど、INSERTやUPDATEのたびにインデックスも更新されるから書き込みが遅くなるんだよ。ストレージ消費も増えるし

ひよこ ひよこ

じゃあどうやってどの列に張るかを決めるの?

ペンギン先生 ペンギン先生

まずクエリパターンを分析するんだ。「このテーブルに対してどんなWHERE句やJOINが多いか」を調べて、その条件に使われる列にインデックスを張るのが基本だよ

ひよこ ひよこ

カーディナリティって言葉も聞くけど何なの?

ペンギン先生 ペンギン先生

値のユニーク度のことだよ。user_idみたいに値が全部違う列はカーディナリティが高くてインデックスが効くんだ。逆に「男/女/その他」みたいな3種類しかない列はカーディナリティが低くて、全件の1/3しか絞れないからインデックスを張っても効果が薄いんだよ

ひよこ ひよこ

複合インデックスって何?順番って関係あるの?

ペンギン先生 ペンギン先生

複数列をまとめて1つのインデックスにするものだよ。順番はすごく重要で、(city, age)というインデックスがあるとき「WHERE city='Tokyo' AND age=25」はフル活用できるけど「WHERE age=25」だけだと使えないんだ。絞り込む力が強い列を先頭に置くのがコツだよ

ひよこ ひよこ

ちゃんと使われてるかはどうやって確認するの?

ペンギン先生 ペンギン先生

EXPLAINコマンドを使うんだよ。クエリの前にEXPLAINをつけると実行計画が見えて、どのインデックスを使っているか・フルスキャンになっていないかが分かるんだ。カバリングインデックス(必要な列が全部インデックスに含まれてるもの)を使えばテーブルアクセス自体をゼロにできて、さらに高速化できるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
インデックス戦略」って出てきたら「クエリを速くするためのインデックス設計方針」と思えればだいたいOK!
📖 おまけ:英語の意味
「Index Strategy」 = インデックス設計戦略
💬 index(索引)+ strategy(戦略・方針)だよ。「インデックスを張る」こと自体は簡単でも、どこに張るかの設計が重要で、それを戦略と呼ぶんだ
← 用語集にもどる