B-Tree
データベースインデックスの基盤となる自己平衡型の多分岐探索木
データ構造データベース
B-Tree とは
B-Tree は、Rudolf Bayer と Edward McCreight が 1970 年に発表した自己平衡型の多分岐探索木で、RDS (PostgreSQL, MySQL) のインデックスの基盤技術である。ディスク I/O を最小化するために設計されており、検索・挿入・削除が O(log n) で行える。
二分探索木との違い
| 観点 | 二分探索木 | B-Tree |
|---|---|---|
| 子ノード数 | 最大 2 | 数百〜数千 |
| 木の高さ | 高い (log₂ n) | 低い (log_m n) |
| ディスク I/O | 多い | 少ない (1 ノード = 1 ページ) |
| 用途 | メモリ内 | ディスクベースの DB |
構造
[10 | 20 | 30] ← ルートノード (3 つのキー)
/ | | \
[1,5] [12,15] [22,25] [35,40] ← リーフノード
- 各ノードが複数のキーを持つ (ディスクページサイズに合わせる)
- 全てのリーフが同じ深さ (自己平衡)
- ノード内のキーはソート済み
B+Tree (データベースで実際に使われる)
B-Tree の変種で、データはリーフノードにのみ格納し、リーフ同士がリンクリストで接続される。
内部ノード: [10 | 20 | 30] ← キーのみ (データなし)
↓
リーフ: [1,5] → [10,12,15] → [20,22,25] → [30,35,40]
↑ データはここにのみ格納、リーフ同士がリンク
範囲検索 (WHERE age BETWEEN 20 AND 30) がリーフのリンクを辿るだけで高速に行える。
LSM ツリーとの比較
| 観点 | B-Tree | LSM ツリー |
|---|---|---|
| 読み取り | 高速 (1 回のツリー走査) | 中程度 (複数 SSTable) |
| 書き込み | 中程度 (ランダム I/O) | 高速 (シーケンシャル I/O) |
| 用途 | RDS (PostgreSQL, MySQL) | DynamoDB, Cassandra |
インデックスの仕組み
CREATE INDEX idx_users_email ON users(email);
-- B+Tree インデックスが作成される
-- email でソートされたリーフノードが、テーブルの行へのポインタを持つ
SELECT * FROM users WHERE email = 'alice@example.com';
-- B+Tree を O(log n) で検索 → 行のポインタを取得 → テーブルから行を取得
計算量
| 操作 | 計算量 |
|---|---|
| 検索 | O(log n) |
| 挿入 | O(log n) |
| 削除 | O(log n) |
| 範囲検索 | O(log n + k) (k = 結果数) |
B-Tree の関連書籍も参考になる。