コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
B-tree の仕組み

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
0. 階乗(再帰)5分
1. フィボナッチ数(再帰)5分
2. 累乗(再帰)5分
3. 配列の合計(再帰)5分
4. 桁数を数える(再帰)5分
5. 文字列を逆順(再帰)5分
6. ユークリッドの互除法(GCD)5分
7. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
0. 線形探索で位置を返す5分
1. 二分探索 (反復版)5分
2. 二分探索 (再帰版)5分
3. lower_bound (最初に >= target の位置)5分
4. ピーク要素検索5分
5. 回転ソート配列での探索5分
6. 第2章まとめクイズ5分
3
ソート
0. バブルソート実装5分
1. 選択ソート5分
2. 挿入ソート5分
3. マージソート5分
4. クイックソート5分
5. カウントソート5分
6. 比較関数つきソート5分
7. 第3章まとめクイズ5分
4
配列 / 文字列の応用
0. 双方向ポインタで和 = K5分
1. スライド窓の最大和5分
2. 回文判定5分
3. 重複なし最長部分文字列5分
4. 大きな数の文字列乗算5分
5. アナグラムグルーピング5分
6. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
0. 長方形クラス(面積と周長)5分
1. スタッククラス(push と pop)5分
2. キュークラス(enqueue と dequeue)5分
3. 単方向リンクリスト5分
4. 二分探索木 (BST) への挿入5分
5. カウンタクラス(機能合成)5分
6. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
0. メモ化フィボナッチ5分
1. DP配列でフィボナッチ5分
2. 階段の登り方5分
3. コイン両替最小枚数5分
4. 0/1 ナップサック問題5分
5. 最長共通部分列 (LCS)5分
6. 第6章まとめクイズ5分
7
総合演習
0. ソート済み 2 配列のマージ5分
1. 配列の k 回転5分
2. カッコの妥当性5分
3. ローマ数字を整数に5分
4. 整数をローマ数字に5分
5. 雨水を溜める5分
6. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
0. コンピューターとOSの役割15分
1. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
2. カーネルとユーザーランド15分
3. システムコールの仕組み15分
4. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
0. プロセスとは15分
1. スレッドとプロセスの違い15分
2. コンテキストスイッチ15分
3. スケジューラとアルゴリズム15分
4. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
0. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
1. 仮想メモリ15分
2. ページングとスワップ15分
3. mmap とメモリマップトファイル15分
4. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
0. ファイルシステムとは15分
1. i-node とディレクトリ15分
2. ext4 / APFS / NTFS の違い15分
3. ジャーナリングと耐障害性15分
4. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
0. レースコンディション15分
1. Mutex と Semaphore15分
2. デッドロック15分
3. 非同期と並行15分
4. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
0. ネットワークとは8分
1. OSI 7階層モデル10分
2. TCP/IP 4階層モデル9分
3. パケットとフレーム9分
4. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
0. IPアドレス (IPv4 / IPv6)10分
1. サブネットマスクと CIDR11分
2. NAT とプライベートIP9分
3. ルーティングと経路選択10分
4. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
0. TCP と UDP の違い9分
1. 3-way ハンドシェイク9分
2. 輻輳制御と再送10分
3. UDP の用途 (DNS / 動画 / ゲーム)8分
4. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
0. HTTP の基本10分
1. HTTP メソッド9分
2. HTTPS と TLS ハンドシェイク10分
3. HTTP/2 と HTTP/3 (QUIC)10分
4. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
0. DNS とは8分
1. レコードタイプ10分
2. 名前解決の流れ10分
3. DNS キャッシュと TTL9分
4. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
0. ロードバランサ (L4 / L7)10分
1. プロキシとリバースプロキシ9分
2. WebSocket とリアルタイム通信9分
3. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
22
[データベース] トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
23
[データベース] クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

01階乗(再帰)
02フィボナッチ数(再帰)
03累乗(再帰)
04配列の合計(再帰)
05桁数を数える(再帰)
06文字列を逆順(再帰)
07ユークリッドの互除法(GCD)
08第1章まとめクイズ — 再帰の基礎
09線形探索で位置を返す
10二分探索 (反復版)
11二分探索 (再帰版)
12lower_bound (最初に >= target の位置)
13ピーク要素検索
14回転ソート配列での探索
15第2章まとめクイズ
16バブルソート実装
17選択ソート
18挿入ソート
19マージソート
20クイックソート
21カウントソート
22比較関数つきソート
23第3章まとめクイズ
24双方向ポインタで和 = K
25スライド窓の最大和
26回文判定
27重複なし最長部分文字列
28大きな数の文字列乗算
29アナグラムグルーピング
30第4章まとめクイズ — 配列 / 文字列の応用
31長方形クラス(面積と周長)
32スタッククラス(push と pop)
33キュークラス(enqueue と dequeue)
34単方向リンクリスト
35二分探索木 (BST) への挿入
36カウンタクラス(機能合成)
37第 5 章クイズ — クラスと OOP
38メモ化フィボナッチ
39DP配列でフィボナッチ
40階段の登り方
41コイン両替最小枚数
420/1 ナップサック問題
43最長共通部分列 (LCS)
44第6章まとめクイズ
45ソート済み 2 配列のマージ
46配列の k 回転
47カッコの妥当性
48ローマ数字を整数に
49整数をローマ数字に
50雨水を溜める
51最終総まとめクイズ
52コンピューターとOSの役割
53OSの歴史(バッチ→マルチタスク→マルチユーザー)
54カーネルとユーザーランド
55システムコールの仕組み
56Linux / macOS / Windows のアーキ比較
57プロセスとは
58スレッドとプロセスの違い
59コンテキストスイッチ
60スケジューラとアルゴリズム
61プロセス間通信(IPC)
62メモリ階層(レジスタ→キャッシュ→RAM→ディスク)
63仮想メモリ
64ページングとスワップ
65mmap とメモリマップトファイル
66ガベージコレクション概要
67ファイルシステムとは
68i-node とディレクトリ
69ext4 / APFS / NTFS の違い
70ジャーナリングと耐障害性
71パーミッションと所有者
72レースコンディション
73Mutex と Semaphore
74デッドロック
75非同期と並行
76イベントループと epoll
77ネットワークとは
78OSI 7階層モデル
79TCP/IP 4階層モデル
80パケットとフレーム
81ルーター・スイッチ・ハブ
82IPアドレス (IPv4 / IPv6)
83サブネットマスクと CIDR
84NAT とプライベートIP
85ルーティングと経路選択
86ファイアウォール基礎
87TCP と UDP の違い
883-way ハンドシェイク
89輻輳制御と再送
90UDP の用途 (DNS / 動画 / ゲーム)
91ポート番号と well-known port
92HTTP の基本
93HTTP メソッド
94HTTPS と TLS ハンドシェイク
95HTTP/2 と HTTP/3 (QUIC)
96REST API の設計原則
97DNS とは
98レコードタイプ
99名前解決の流れ
100DNS キャッシュと TTL
101CDN の仕組みと Anycast
102ロードバランサ (L4 / L7)
103プロキシとリバースプロキシ
104WebSocket とリアルタイム通信
105gRPC と HTTP/2 利用
106データベースとは
107RDB と NoSQL の違い
108データベースの歴史
109エンティティ関係モデル (ER)
110主キー・外部キー・候補キー
111正規化とは何か
112第1正規形
113第2正規形
114第3正規形
115非正規化のトレードオフ
116インデックスの役割
117B-tree の仕組み
118B+tree(実際の DB 実装)
119ハッシュインデックス
120カバリングインデックス
121トランザクションとは
122ACID 特性
123分離レベル
124MVCC(マルチバージョン同時実行制御)
125デッドロックと回避
126クエリプランナの役割
127EXPLAIN の読み方
128Nested Loop / Hash / Merge Join
129インデックスチューニング
130統計情報とカーディナリティ
131レプリケーション
132シャーディング
133CAP 定理
134結果整合性
135NewSQL と分散 SQL

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / 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 時間いつでも、あなたのレベルに合わせて日本語で答えます。