【びーつりー】

B木 とは?

💡 データベースの高速検索を支える「幅広い」木
📌 このページのポイント
B木(B-Tree)の構造 20 40 ルートノード 5 15 25 35 50 70 1,3 7,10 16,18 22,24 28,30 36,38 42,48 55,60 75,80 ルート 内部ノード リーフノード(データ)
B木の階層構造(各ノードに複数のキーを格納)
ひよこ ひよこ

二分木と何が違うの?

ペンギン先生 ペンギン先生

二分木は1ノードに1キー・2つの子ノード。B木は1ノードに数百〜数千のキーと子ノードを持てる。木の高さがB木だと3〜4段で数百万レコードをカバーできる。ディスクから読み込む回数=木の高さだから、B木は3〜4回のディスクI/Oで目的のデータを見つけられるんだよ

ひよこ ひよこ

なんでディスクI/Oが重要なの?

ペンギン先生 ペンギン先生

メモリアクセスは数十ナノ秒、ディスクアクセス(SSDでも)は数百マイクロ秒。約1万倍の差がある。B木は1回のディスクI/Oで多くのキーをまとめて読み込むから、ディスクアクセス回数を最小化できる。1ノードのサイズをディスクブロックサイズ(通常4KB〜16KB)に合わせるのが効率的なんだよ

ひよこ ひよこ

B+木とB木の違いは?

ペンギン先生 ペンギン先生

B木は全ノードにデータを持つ。B+木はリーフノード(最下段)だけにデータを持ち、内部ノードはキーのみ。B+木のメリットは①内部ノードにキーを詰め込めるから木がさらに低くなる、②リーフノードがリンクリストで繋がっているから範囲検索(WHERE age BETWEEN 20 AND 30)が高速。RDBMSのインデックスはほぼB+木だよ

ひよこ ひよこ

インデックスの仕組みがわかった!

ペンギン先生 ペンギン先生

CREATE INDEX idx_age ON users(age);と書くと、age列の値をキーとしたB+木が作られる。WHERE age = 25のクエリは、B+木を3〜4段たどるだけで該当行のポインタを取得できる。インデックスなしだとテーブル全行をスキャン(Full Table Scan)する必要がある。100万行のテーブルなら、3回vs100万回の比較の差だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「B木」って出てきたら「データベースインデックスに使われる高速検索用のデータ構造」と思えればだいたいOK!
📖 おまけ:英語の意味
「B-Tree」 = B木
💬 BはBalanced(平衡)、Broad(幅広い)、Bayerの頭文字など諸説ある。発明者のBayerは「Bの由来は言わない」と語っているよ
← 用語集にもどる