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

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

ACID 特性

「巻き戻します」と言われても、信じる根拠がない

途中で落ちたトランザクションは再起動時に巻き戻される、と前の回で書きました。しかし電源が抜けた瞬間、メモリの中身は消えます。何を手がかりに「どこまでが確定で、どこからが未確定か」を判断しているのでしょうか。

答えは、本体を書き換える前にログを書いているからです。DB は更新を頼まれると、まず「この行をこう変える」という記録をログへ書きます。順番は次のとおりです。

  1. 変更内容をログに書く
  2. COMMIT のとき、ログに「ここまで確定」の印を書く
  3. その印がディスクに届いたことを確認してから、アプリに成功を返す
  4. 本体のデータファイルへは、その後で反映する

再起動時にはこのログを頭から読み直し、確定の印があるものだけ本体へ反映し、印のないものは捨てます。だから、どのタイミングで落ちても半端な状態が残りません。原子性 (Atomicity) と永続性 (Durability) は、この 1 本のログで同時に支えられています。

順番が逆でない理由もはっきりしています。本体のデータファイルへの書き込みは、あちこちのページを書き換えるのでディスクの上を飛び回ります。ログは末尾に足していくだけなので、順番に書けます。返事を早く返したい部分だけを順次書き込みで済ませ、飛び回る方は後回しにする、という分担です。

落ちなくても、2 人来ると壊れる

残る 2 つは、何も落ちていないときの話です。

在庫が 1 個の商品を 2 人が同時に買おうとしたとします。どちらのトランザクションも「在庫は 1 個ある」と読み、どちらも 1 個減らして、在庫は -1 になります。片方ずつ順番に実行していれば起きなかった結果です。これを防ぐのが分離性 (Isolation) で、実現には行を待たせるか、更新前の値を別に取っておくかのどちらかが要ります。

一貫性 (Consistency) は、トランザクションが終わった時点で、DB に宣言したルールが全部守られていることです。主キーの重複、参照先のない外部キー、残高がマイナスになる更新。これらが残るくらいなら、DBMS はコミットを失敗させて全部巻き戻します。

SQL クエリ

ALTER TABLE accounts ADD CONSTRAINT chk_balance CHECK (balance >= 0);

ただし DBMS が見張れるのは、こうして宣言されたルールだけです。「出金額と入金額は一致する」のような業務の決まりごとは、アプリ側の責任として残ります。

速さのために、どれを弱めるか

4 つを厳密に守るほど遅くなります。いちばん効くのは、COMMIT のたびにログをディスクへ押し出す処理です。MySQL の innodb_flush_log_at_trx_commit を 1 から 2 に変えると、書き出しは OS のキャッシュまでで済み、ディスクへの反映は約 1 秒に 1 回にまとまります。MySQL のプロセスが落ちただけならデータは残りますが、サーバごと電源が落ちると直前の約 1 秒分のコミットが消えます。

つまみを回すこと自体は悪ではありません。危ないのは、何を捨てたかを知らずに回すことです。消えても翌日集計し直せるログと、消えたら返金が必要な決済とで、同じ設定を使う理由はありません。

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

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

  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • メモリプログラムとデータを一時保持する高速領域
  • 判断YES/NO 分岐を表す菱形
  • branchGit で開発するときに毎日打つ 5 つの基本コマンド
  • 外部キーテーブル同士を結びつける鍵
  • 主キーレコードを一意に特定する列
  • コミット変更内容を記録するスナップショット
  • 処理計算や代入を表す長方形
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • 分離レベル

    Read Uncommitted から Serializable まで 4 段階を比較する

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

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

  • デッドロックと回避

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

  • クエリプランナの役割

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

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

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