インデックスとは

いんでっくす

データベースで、表の特定の列の値から、その値を持つ行の位置をすばやく探すためのデータ構造。索引とも呼ぶ。B+木がよく使われる。検索は速くなるが、行の追加・更新・削除のたびに保守が必要になり、記憶容量も使う。

「インデックス」は、1分野の4問の練習問題に出てきます(データベースの基礎など)。

この用語の分野: データベースの基礎

B+木のインデックスのしくみ

関係データベースのインデックスには、B+木がよく使われます。B+木は、根から葉までの段数がどこでも等しい、枝分かれの多い木構造で、葉に列の値と行の位置を値の順に持ち、葉どうしは順につながっています。1つのノードから100個に枝分かれするなら、3段で100万件を区別できるので、100万行の表でも数回の読み出しで目的の行に着けます。葉が値の順につながっているので、= による検索だけでなく、BETWEENのような範囲の検索や、ORDER BY の並べ替えにも使えます。

インデックスが効く場合と効かない場合

インデックスは、条件に合う行が全体のごく一部に絞り込まれる、選択性の高い列で効果を発揮します。すべての値が異なる会員番号のような列は理想的ですが、2種類しか値のない性別のような列では、約半数の行が該当するので、インデックスを経由して1行ずつ取り出すより、表を順に読む全件走査のほうが速いことが多くなります。また、列に関数を適用した条件や、LIKE '%田' のような後方一致の条件では、ふつうのインデックスは使えないことがあります。

書き込みの代償

インデックスは、表とは別に保守されるデータ構造です。行を追加・更新・削除するたびに、関係するすべてのインデックスも更新する必要があるので、インデックスが多いほど書き込みは遅くなり、記憶容量も増えます。そのため、よく使う検索の条件や結合の条件になる列を選んでインデックスを作り、使われていないインデックスは削除するのが基本です。主キーやUNIQUE制約の列には、多くのDBMSが自動でインデックスを作ります。

インデックスの練習問題に挑戦

100万行ある会員表の会員番号の列にB+木のインデックスを作成した。一般に期待できる効果と、その代償の組み合わせとして正しいものはどれか。

  1. AWHERE 会員番号 = 12345 のような検索が速くなる一方、行の追加や更新のたびにインデックスも更新するので、書き込みは遅くなる
  2. Bすべての列での検索が速くなり、代償はない
  3. C表の行が会員番号の順に並べ替えられるので、どの検索も速くなる一方、記憶容量は半分になる
答えと解説を見る

正解:A. WHERE 会員番号 = 12345 のような検索が速くなる一方、行の追加や更新のたびにインデックスも更新するので、書き込みは遅くなる

インデックス(索引)は、表の特定の列の値から、その値を持つ行の位置をすばやく探すためのデータ構造で、関係データベースではB+木がよく使われます。インデックスがなければ、WHERE 会員番号 = 12345 の行を探すのに100万行を順に調べる(全件走査)必要がありますが、B+木では根から葉まで数段たどるだけで見つかります。例えば1つのノードから100個に枝分かれするなら、100 × 100 × 100 = 100万なので、およそ3段です。B+木の葉は値の順につながっているので、BETWEENのような範囲の検索や、ORDER BY の並べ替えにも使えます。一方、行を追加・更新・削除するたびにインデックスも更新する必要があるので、書き込みは遅くなり、インデックスの分の記憶容量も必要です。インデックスを作っていない列での検索は速くなりません。

100万行の会員表で、会員番号(すべて異なる)、都道府県(47種類)、性別(2種類でほぼ半々)の列に、それぞれB+木のインデックスを作ることを考える。WHERE句で1つの列の値を指定して検索するとき、インデックスの効果が最も小さいと考えられる列はどれか。

  1. A都道府県
  2. B性別
  3. C会員番号
答えと解説を見る

正解:B. 性別

インデックスが効果を発揮するのは、条件に合う行が全体のごく一部に絞り込まれる場合です。会員番号はすべて異なるので、条件に合うのは1行だけで、インデックスで直接たどり着けます。都道府県は47種類なので、均等に分かれていれば、1つの値で約 100万 ÷ 47 ≒ 2万1千行(全体の約2%)に絞られます。性別は2種類でほぼ半々なので、どちらの値を指定しても約50万行(約50%)が該当します。これほど多くの行を、インデックスを経由して1行ずつ取り出すと、表を最初から順に読む全件走査より遅くなることが多いので、DBMSのオプティマイザはインデックスを使わない実行方法を選ぶことがあります。このように、値の種類が多く、条件で行を絞り込める度合い(選択性)が高い列ほど、インデックスの効果は大きくなります。

よくある質問

インデックスはすべての列に作ったほうがよいですか?

よくありません。インデックスが多いほど、行の追加や更新のたびに保守する負担が増え、記憶容量も使います。よく検索や結合の条件になり、行を十分に絞り込める列を選んで作ります。

インデックスを作ったのに使われないのはなぜですか?

条件に合う行が多すぎて全件走査のほうが速いとオプティマイザが判断した場合や、列に関数を適用した条件、後方一致のLIKEのように、インデックスの並び順を生かせない条件の場合などが考えられます。

解説の中の「インデックス」

「インデックス」が出てくる問題(4問)

  1. 100万行ある会員表の会員番号の列にB+木のインデックスを作成した。一般に期待できる効果と、その代償の組み合わせとして正しいものはどれか。
  2. 100万行の会員表で、会員番号(すべて異なる)、都道府県(47種類)、性別(2種類でほぼ半々)の列に、それぞれB+木のインデックスを作ることを考える。WHERE句で1つの列の値を指定して検索するとき、インデックスの効果が最も小さいと考えられる列はどれか。
  3. SQLの文は、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)に分けられる。DDLに分類されるものはどれか。
  4. 関係データベースのビューの説明として、正しいものはどれか。

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

関係データベース ビュー SQL トランザクション ACID特性 E-R図 外部キー 主キー 正規化 第3正規形

用語集の一覧へ