【仕組み解説】データベースのインデックスはなぜ速い? — B-Treeの仕組みを図解
それは確かに遅そう…。インデックスがあるとどう変わるの?
なるほど!でも索引ってどういう構造で整理されているの?
最も一般的なのが「B-Tree(ビーツリー)」という木構造だよ。根(ルート)から枝分かれしていって、葉(リーフ)に実際のデータへのポインタがある。たとえば100万件のデータでも、B-Treeなら約20回の比較で目的の行にたどり着ける。計算量でいうと O(log n) で、フルスキャンの O(n) と比べると桁違いに速いんだ。
O(log n) ってことは、データが倍に増えても比較回数は1回しか増えないってこと?
その通り!100万件で約20回、200万件でも約21回。これがB-Treeの強さだね。ちなみに木の各ノードは複数のキーを持てるから、ディスクの読み取り回数も最小限に抑えられる設計になっているんだ。
カバリングインデックスっていうのもあるって聞いたけど、それは何?
カバリングインデックスは、クエリが必要とするカラムがすべてインデックスに含まれている状態のことだよ。通常はインデックスで行の位置を見つけてから、テーブル本体にデータを取りに行く。でもカバリングインデックスなら、インデックスだけで結果が返せるからテーブルへのアクセスが不要になる。これが最速パターンだね。
むやみに貼っちゃダメなんだね…。効果があるか確認する方法ってあるの?
B-Tree以外のインデックスもあるの?
あるよ。代表的なのが「ハッシュインデックス」だね。ハッシュ関数で値を変換して、直接データの場所を割り出す方式だ。完全一致検索(WHERE id = 100)なら O(1) で B-Tree より速い場合もある。ただし範囲検索(WHERE id BETWEEN 1 AND 100)や ORDER BY には使えないという大きな制約がある。だから汎用性の高い B-Tree がデフォルトで使われることがほとんどだね。
インデックスの設計って奥が深いんだね…。実務ではどう判断すればいいの?