インデックス(index)
- テクノロジ系
- データベース
- 基本情報
- 応用情報
- 重要度 ★★★☆☆
列の値と、その値を持つ行の位置を別に並べておく仕組み。目的の行を速く探せる。
もう少し詳しい説明
索引(インデックス)は、探したいものがどこにあるかを別に並べておく一覧です。
本の巻末にある索引を思い浮かべてください。「正規化」について知りたいとき、1ページ目から順にめくって探すのは大変です。索引を引けば「128ページ」と分かるので、そこへ直行できます。
データベースの索引も、やっていることは同じです。「この値を持つ行は、どこにあるか」を別に並べておき、そこを見てから本体へ飛びます。
ただではない
ここが要点です。索引はタダで速くなる魔法ではありません。
本の中身を書き換えたら、索引のページ番号も直さなければなりません。直し忘れれば索引は嘘をつきます。データベースでも同じで、行を追加・更新・削除するたびに、索引のほうも直す必要があります。
つまり、こういう交換になります。
- 検索は速くなる(ことがある)
- 追加・更新・削除は遅くなる
- 容量は増える(索引は本体とは別に場所を取る)
索引を10個も20個も作れば、そのぶん書き換えの手間が積み上がります。「とりあえず全部の列に付ける」は逆効果です。
効く場面と効かない場面
索引が効くのは、値の種類が多い列を条件にして、表のごく一部だけを取り出す検索です。会員番号で1人を探す、といった場合です。
逆に効きにくいのは次のような場合で、データベース側の判断で索引が使われないこともあります。
- 値の種類が少ない列(「男・女」「有効・無効」など)— 索引を引いても半分が該当してしまう
- 結果が表の大半を占める検索 — 索引をたどるより、全部読んだほうが速い
- 列に計算や関数を適用した条件 — 索引に並んでいる値と一致しなくなる
3つ目は分かりにくいので補足すると、索引は「その列の値そのもの」を並べたものです。値を加工してから比べる条件だと、並べておいた順序が使えません。
しくみ
実装には B木(B-tree)という構造がよく使われます。値を順序よく並べて枝分かれさせておくことで、目的の値まで少ない回数でたどり着ける形です。全部を先頭から調べる方法(全表走査)と比べて、調べる回数が桁違いに減ります。
なお、主キーには重複がないことを速く確かめる必要があるため、索引が自動的に作られるのが一般的です。
試験ではこう出る
科目A(旧・午前)のデータベース分野で、性能に関する問題として出ます。多いのは、索引を付けたときの効果と副作用を問うもので、「検索は速くなるが更新は遅くなる」という交換関係が答えの軸になります。応用情報では、どの列に索引を付けるべきかの判断や、索引があっても使われない場面まで問われます。速くなる話だけを覚えていると、副作用を問う選択肢に引っかかります。
関連する用語
- 二分探索
- 並んでいるものを半分ずつ絞り込む探し方。索引が速いのはこの仕組みによる
- 主キー
- 行を1つに特定する列。索引が自動で付くことが多いが、索引は主キーの条件ではない
- 一意性制約
- 重複を禁止する決まり。索引そのものは重複を禁止しない
- 正規化
- 同じ事実を1か所にだけ書くよう表を分ける設計。表の形を変える点で目的が違う
ミニクイズ
データベースの表に索引(インデックス)を追加したときに起こることとして、最も適切なものはどれか。
正解は 2番:その列を条件にした検索は速くなることがあるが、行の追加・更新・削除は遅くなる
索引は本の巻末の索引と同じで、探すのは速くなりますが、中身を書き換えるたびに索引のほうも直さなければならないぶん、追加・更新・削除は遅くなります。重複を禁止するのは一意性制約であって索引そのものの働きではありません(一意索引という組合せはあります)。また索引は本体とは別に場所を取るので、容量は増えます。
最終更新:2026-09-14