コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
B-tree の仕組み

データベース内部構造:インデックス・トランザクション・分散DB

SQLの書き方ではなく、DBMSの内側を学ぶコースです。RDBとNoSQL、正規化、B-tree、トランザクションとMVCC、クエリプランナ、レプリケーションと分散SQLを通して、性能と整合性の判断根拠を身につけます。

1
データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
2
正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
3
インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
4
トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
5
クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
6
スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

データベース内部構造:インデックス・トランザクション・分散DB

01データベースとは
02RDB と NoSQL の違い
03データベースの歴史
04エンティティ関係モデル (ER)
05主キー・外部キー・候補キー
06正規化とは何か
07第1正規形
08第2正規形
09第3正規形
10非正規化のトレードオフ
11インデックスの役割
12B-tree の仕組み
13B+tree(実際の DB 実装)
14ハッシュインデックス
15カバリングインデックス
16トランザクションとは
17ACID 特性
18分離レベル
19MVCC(マルチバージョン同時実行制御)
20デッドロックと回避
21クエリプランナの役割
22EXPLAIN の読み方
23Nested Loop / Hash / Merge Join
24インデックスチューニング
25統計情報とカーディナリティ
26レプリケーション
27シャーディング
28CAP 定理
29結果整合性
30NewSQL と分散 SQL

データベース内部構造:インデックス・トランザクション・分散DB

B-tree の仕組み

索引を辿るのに 20 回もディスクを叩けない

並んだデータを速く探す構造なら、二分探索木がよく知られています。1 回の比較で候補が半分になるので、1000 万件でも 24 段ほどで目的地に着きます。段数だけを見れば十分に速い。

それでも DB の索引は二分探索木を使いません。理由は、1 段下りるたびに何が起きるかにあります。

索引はメモリに全部は載りません。大部分はディスク上にあり、必要な部分だけを読み込みます。しかもディスクは 1 バイト単位では読めず、決まった大きさのかたまり単位で読みます。メモリから値を取るのが数ナノ秒なのに対し、この読み込みは SSD でも数十マイクロ秒かかります。桁が 4 つ違います。

つまり 24 段下りるということは、最悪 24 回この待ち時間を払うということです。段数ではなく、ディスクに触った回数が効いてきます。

ディスクがかたまり単位でしか読めないのは、記憶装置の作りの問題で、こちらの都合では変えられません。索引の設計は、この決まりに逆らわない形を選ぶところから始まります。

1 段で 100 通りに分かれる

そこで発想を変えます。1 回読むならどうせかたまりで読むのだから、そのかたまりを目一杯使えばよい。

B-tree は、1 つの節をディスクの読み込み単位と同じ大きさ(16 キロバイト程度)に合わせ、その中に境界となる値を 100 個以上詰め込みます。1 回読むだけで、次に進む先が 100 通り以上に絞られます。

プレーンテキスト

            [ 30 | 60 ]
           /     |     \
    [10|20]   [40|50]   [70|80|90]

上の図は境界が 2 つしかない小さな例です。50 を探すなら、根の 30 と 60 を見て「30 以上 60 未満」の枝へ下り、その中を見て終わりです。実際には 1 つの節が 100 通り以上に分かれるので、1000 万件でも 3 段か 4 段しかありません。ディスクに触る回数が 24 回から 4 回になります。理論上の段数ではなく、この定数の軽さが選ばれた理由です。

実際にはもう少し得をします。根とその次の段は、どの検索でも必ず通るので、ほぼ常にメモリに載ったままになります。ディスクへ取りに行くのは下の 1 段か 2 段だけで、3 段の木だから 3 回待つ、という話にはなりません。

詰まったら、真ん中を上に押し上げる

木の形をした索引には、片側にばかり伸びて段数が増えてしまう心配が付きまといます。B-tree はこれを、決まった手続きで防いでいます。

節が満杯の状態で新しい値が来たら、その節を 2 つに割ります。このとき真ん中の値だけを親へ渡し、残りを左右に分けます。親も満杯なら、親でも同じことが起きます。それが根まで届くと、根が 2 つに割れて新しい根が上にできます。

木が伸びるのは葉の側ではなく根の側で、これが効きます。どの葉も常に同じ深さに揃うので、どの値を探しても掛かる回数が変わりません。削除で節が空きすぎたときは、隣とくっつけるか、値を分け合って埋めます。

この手続きには、外から順番を指示する必要がありません。挿入するたびに、詰まった節が自分で割れていくだけです。形を保つ仕事を、木自身が引き受けています。

なお、実際の DB が使っているのは、値の実体を葉だけに置いた B+tree という変種です。同じ発想を、もう一段だけ押し進めたものになっています。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 二分探索中央と比較して半分ずつ範囲を狭める探索
  • メモリプログラムとデータを一時保持する高速領域
  • 記憶装置メモリ・SSD などデータを保持する機器
  • 設計何をどう作るかを決める前工程
  • treeディレクトリ構造をツリー表示するコマンド
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • B+tree(実際の DB 実装)

    リーフを連結リストで結ぶ B+tree が範囲検索に強い理由

  • ハッシュインデックス

    等価検索専用の高速インデックスとその制約

  • カバリングインデックス

    テーブル本体を読まずに済む複合インデックス設計

  • トランザクションとは

    BEGIN / COMMIT / ROLLBACK の意味と必要性を学ぶ

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。