データベースの基礎
100万行ある会員表の会員番号の列にB+木のインデックスを作成した。一般に期待できる効果と、その代償の組み合わせとして正しいものはどれか。
- AWHERE 会員番号 = 12345 のような検索が速くなる一方、行の追加や更新のたびにインデックスも更新するので、書き込みは遅くなる
- Bすべての列での検索が速くなり、代償はない
- C表の行が会員番号の順に並べ替えられるので、どの検索も速くなる一方、記憶容量は半分になる
答えと解説を見る
正解:A. WHERE 会員番号 = 12345 のような検索が速くなる一方、行の追加や更新のたびにインデックスも更新するので、書き込みは遅くなる
インデックス(索引)は、表の特定の列の値から、その値を持つ行の位置をすばやく探すためのデータ構造で、関係データベースではB+木がよく使われます。インデックスがなければ、WHERE 会員番号 = 12345 の行を探すのに100万行を順に調べる(全件走査)必要がありますが、B+木では根から葉まで数段たどるだけで見つかります。例えば1つのノードから100個に枝分かれするなら、100 × 100 × 100 = 100万なので、およそ3段です。B+木の葉は値の順につながっているので、BETWEENのような範囲の検索や、ORDER BY の並べ替えにも使えます。一方、行を追加・更新・削除するたびにインデックスも更新する必要があるので、書き込みは遅くなり、インデックスの分の記憶容量も必要です。インデックスを作っていない列での検索は速くなりません。
- A. 正しい。検索は速くなりますが、書き込みのたびにインデックスを保守する負担が増えます。
- B. インデックスが効くのは、インデックスを作った列での検索です。書き込みの負担と記憶容量という代償もあります。
- C. インデックスは表とは別に作るデータ構造で、記憶容量はむしろ増えます。