コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
Nested Loop / Hash / Merge Join

データベース内部構造:インデックス・トランザクション・分散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

Nested Loop / Hash / Merge Join

行が 100 倍になったら、JOIN が返ってこなくなった

ユーザーと注文を結合するクエリが、テスト環境では 30 ミリ秒で返っていたとします。本番のデータで同じものを流したら、数分待っても返ってきません。SQL は 1 文字も違いません。

素直に結合する手順は、外側のテーブルを 1 行ずつ取り出し、そのたびに内側のテーブルから相手を探す二重ループです。

プレーンテキスト

for u in users:
    for o in orders:
        if o.user_id == u.id:
            出力する

ユーザー 100 件、注文 1000 件なら 10 万回の比較で済みます。ユーザー 1 万件、注文 100 万件になると 100 億回です。件数が 100 倍になると、かかる時間は 1 万倍になります。テスト環境で速かったことは、何の保証にもなりません。

内側を毎回探し直さない

この二重ループが遅いのは、内側を毎回頭から探しているからです。避け方は 2 つあります。

1 つは、内側の結合列に索引があることです。すると内側は 1 回の探索で相手にたどり着けるので、外側の行数ぶんの探索だけで終わります。外側が絞り込みで数十件まで減っているなら、これがいちばん速い形になります。

もう 1 つは、内側を一度だけ全部読んで、結合列をキーにした表をメモリ上に作ることです。あとは外側を 1 行ずつ流しながらその表を引くだけで相手が見つかります。両方のテーブルが大きく、外側もほとんど絞れないときは、こちらが有利です。ハッシュ結合と呼ばれる方式で、= での結合にしか使えず、表がメモリに収まらないと一時ファイルへ退避するぶん遅くなります。

ハッシュ結合が = にしか使えないのは、キーから置き場所を直接計算する仕組みだからです。「近い値」を探すことはできないので、>= や BETWEEN で結ぶ結合には使えません。

両方が同じ列の順にすでに並んでいるなら、先頭から突き合わせて 1 回ずつ進めるだけで済みます。索引の並び順をそのまま使えるときに選ばれる形で、範囲での結合でもこの順序を活かせます。

選ぶのはこちらではない

どれを使うかを SQL で指定することはありません。プランナが行数の見積もりから決めます。ですから JOIN が遅いときも、手順を指定しに行くのではなく、まず選ばれた手順を確かめます。

プレーンテキスト

Hash Join
  Hash Cond: (o.user_id = u.id)
  ->  Seq Scan on orders o
  ->  Hash
        ->  Index Scan using idx_users_country on users u

こちらが動かせるのは、判断の材料の方です。片方をもっと絞れないか、内側の結合列に索引があるか、メモリ上に表を作る余地があるか。そこが変われば、選ばれる手順も変わります。

どちらを外側にするかもプランナが決めます。小さい方を外側に置けば探索の回数が減るので、絞り込みが効く側を外に回すのが基本形です。ただしこの判断も行数の見積もりに基づいているので、見積もりが外れていれば内外の割り当ても一緒に間違えます。JOIN が想定外に遅いとき、疑うべきは結合の書き方ではなく、その手前の見積もりであることがよくあります。

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

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

  • JOIN複数テーブルをくっつけて 1 つの結果に並べる SQL
  • テストバグを見つける工程
  • SQLデータベースを操作するための共通言語
  • テーブルDB の表 (Excel のシートみたいなもの)
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • メモリプログラムとデータを一時保持する高速領域
  • 判断YES/NO 分岐を表す菱形
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • インデックスチューニング

    効くインデックス・効かないインデックスを見抜く

  • 統計情報とカーディナリティ

    プランナがコストを計算するために使う統計の仕組み

  • レプリケーション

    Primary / Replica 構成での読み取り分散と整合性

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

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