コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
分離レベル

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

分離レベル

同じ問い合わせを 2 回したら、答えが変わった

集計処理の途中で、同じ口座の残高を 2 回読んだとします。

プレーンテキスト

T1: SELECT balance FROM accounts WHERE id = 1;        -- 5000
T2: UPDATE accounts SET balance = 8000 WHERE id = 1;  COMMIT;
T1: SELECT balance FROM accounts WHERE id = 1;        -- 8000

T1 は自分では何も書き換えていないのに、2 回目の答えが違います。合計と内訳が合わない集計表ができあがり、原因を探しても T1 のコードには何も見つかりません。

似た形で、件数が変わることもあります。WHERE status = 'pending' の件数を 2 回数えたら、間に他人が 1 件挿入していて 5 件が 6 件になる。どちらも「読んでいる間に、外の世界が進んでいる」ことから来ています。

どこまで見えてよいかを、こちらが決める

外の世界を完全に止めれば起きません。ただし止めるとは、トランザクションを 1 本ずつ順番に実行することです。同時に 200 リクエストが来るアプリでこれをやれば、待ち行列ができます。そこで DB は「どこまで見えてしまってよいか」を選べるようにしています。これが分離レベルです。

いちばん緩い段では、他人がまだコミットしていない値まで見えます。相手が最後に ROLLBACK すれば、一度も存在しなかった数字を読んだことになります。これを選ぶ理由はほとんどありません。

実務の選択肢は、その 1 つ上からです。「他人が確定させた変更は、途中でも見える」が Read Committed で、PostgreSQL の既定です。冒頭の 5000 が 8000 に化けるのは、この段では仕様どおりの挙動になります。「自分が始めた時点の景色を最後まで固定する」が Repeatable Read で、MySQL の既定です。集計やレポートのように途中で数字が動くと困る処理は、こちらに寄せます。

いちばん厳しい段は、同時に走らせても順番に実行したのと同じ結果になることを保証します。そのぶん、衝突したトランザクションはエラーで打ち切られるので、アプリ側でやり直す前提の作りが必要になります。

上げる前に、ぶつかったことを検出する手がある

分離レベルは接続やトランザクション全体にかかるので、上げると関係のないクエリまで巻き添えで遅くなります。守りたいのが特定の 1 か所だけなら、行に版番号を持たせる手があります。

SQL クエリ

SELECT version, stock FROM products WHERE id = 10;   -- version=5

UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = 10 AND version = 5;

更新結果が 0 行なら、読んでから書くまでの間に誰かが先に更新したということです。そのときだけ読み直してやり直します。ぶつからない限り誰も待たないので、Web アプリではよく使われる形です。

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

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

  • 処理計算や代入を表す長方形
  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • コミット変更内容を記録するスナップショット
  • TRANSACTION「全部成功 or 全部なかったことに」を制御する SQL コマンド
  • PostgreSQL機能が豊富なオープンソースのRDBMS
  • MySQL広く使われるオープンソースのRDBMS
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • MVCC(マルチバージョン同時実行制御)

    読み手をブロックしないバージョン管理の仕組み

  • デッドロックと回避

    複数トランザクションが互いのロックを待ち続けるデッドロックが起きる原理と、DBMS の検出の仕組み、アプリ側で予防する設計原則を実務目線で解説します。

  • クエリプランナの役割

    SQL から実行計画が生成される過程を追う

  • レプリケーション

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

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

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