データベースの検索を高速化する仕組み:B-treeと複合インデックスの基礎

こんにちは。ゆうせいです。

本記事では、データベースの性能を向上させるための重要な技術であるインデックスについて、新人エンジニアの皆様に向けて解説します。特に、広く採用されているB-treeというデータ構造と、複数の列を組み合わせる複合インデックスの2つに焦点を当てて説明します。

B-treeインデックスの仕組みと特徴

データベースから特定の情報を探し出す際、すべてのデータを1つずつ確認していては膨大な時間がかかります。検索時間を短縮するために用いられる仕組みがインデックスです。多くのリレーショナルデータベースでは、B-tree(バランス木)と呼ばれるデータ構造が採用されています。

B-treeを理解するためには、紙の国語辞典を想像してください。国語辞典は「あ行」「か行」といった大きな見出しがあり、大きな見出しの下にさらに細かい見出しが整理されています。探したい単語がある場合、最初のページから1ページずつ全て読むのではなく、見出しをたどることで数回の操作で目的の単語へたどり着くことができます。

B-treeも国語辞典と同様に、データを階層状の木構造に整理して保持します。最上部の層から中間層を経て、最下層へと条件を絞り込んでいく仕組みです。

B-treeの各階層(ノードと呼びます)は、格納できる最大データ数があらかじめ決まっています。最大容量をMとした場合、木構造のバランスを崩さないよう、原則として各ノードは少なくとも \frac{M}{2} 個のデータを保持するように自動的に内部で調整されます。

B-treeのメリット

  • 検索にかかる処理時間がデータの総量に関わらず安定している
  • データの追加や削除を行っても、木構造のバランスが自動的に保たれるため検索性能が低下しにくい
  • 一致する値を検索する処理だけでなく、特定範囲の値を検索する処理にも適している

B-treeのデメリット

  • データを新しく追加したり削除したりする際、木構造のバランスを保つための並べ替え処理が発生するため、書き込み操作に負荷がかかる
  • インデックスの構造自体を保存するためのディスク容量を消費する

複合インデックスの仕組みと特徴

データベースの表(テーブル)において、1つの列だけでなく、複数の列を組み合わせて作成するインデックスを複合インデックスと呼びます。

複合インデックスの仕組みは、電話帳の並び順に例えることができます。電話帳が「都道府県」「市区町村」「氏名」の順番で規則正しく並んでいると想定してください。東京都、新宿区、山田太郎という3つの条件が揃っていれば、電話帳の順番通りに探すことができるため非常に素早く情報を見つけることが可能です。しかし、「新宿区」という条件だけで探そうとすると、全国の都道府県のページから新宿区を探さなければならず、電話帳の並び順を有効に活用できません。

複合インデックスも電話帳と同様に、設定した列の順番に従ってデータを整理します。複合インデックスの特性上、左側の列から順番に検索条件を指定した場合にのみ、高い検索性能を発揮するという厳格な規則が存在します。

複合インデックス作成の記述例

以下は、利用者の姓と名を組み合わせた複合インデックスを作成するSQL文の例です。

CREATE INDEX idx_user_name ON users (last_name, first_name);

上記のようにインデックスを作成した場合、姓を指定した検索や、姓と名の両方を指定した検索では処理の高速化が期待できます。名のみを指定した検索ではインデックスの効果は得られません。

複合インデックスのメリット

  • 複数の条件を組み合わせた複雑な検索処理を高速化できる
  • 単独のインデックスを複数作成するよりも、特定の検索条件において高い効果を発揮する

複合インデックスのデメリット

  • 複数の列のデータを保持するため、単独の列に対するインデックスよりもデータサイズが大きくなる
  • 検索条件で指定する列の順序を誤ると、インデックスが機能しない

まとめ

データベースの検索性能を担保するためには、B-treeによる階層的なデータ管理と、複合インデックスによる複数条件の最適化を理解することが不可欠です。インデックスは検索を高速化する一方で、データの書き込み時には負荷がかかるという事実を認識し、適切な箇所に設計する必要があります。

今後の学習ステップとして、以下の順序で実践的な知識を深めていく手順を提示して結びとします。

  1. SELECT文やWHERE句を用いた基本的なデータベースの操作方法を習得する
  2. EXPLAIN句などの実行計画を確認する機能を用いて、自分が書いた検索処理で意図通りにインデックスが使用されているかを確認する
  3. 実際のシステム開発において、データの更新頻度と検索頻度の釣り合いを考慮しながらインデックスを設計する

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。