【びーつりー】

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の由来は言わない」と語っているよ
← 用語集にもどる