付録B. 目的別の読み方と参考資料
本書は01章から順に読めますが、実務上の課題から逆引きすることもできます。
初めてDB内部を学ぶ
Section titled “初めてDB内部を学ぶ”推奨順:
- 01. データベースシステムの全体像
- 03. ページ、レコード、バッファプール
- 04. B-木、B+木、インデックス設計
- 06. SQLから論理実行計画へ
- 07. 物理実行と演算子
- 10. ACIDと分離レベル
- 11. 並行性制御
- 12. WALとクラッシュリカバリ
まず単一ノードDBのクエリ、メモリ、トランザクション、復旧を一つの流れとして理解してから分散DBへ進みます。
遅いクエリを診断したい
Section titled “遅いクエリを診断したい”EXPLAIN解析では、最上位の時間ではなく、推定行と実行が最初にずれた演算子、過剰なループ数、ディスク退避、ページアクセスを探します。
トランザクションの競合を診断したい
Section titled “トランザクションの競合を診断したい”業務上の不変条件を先に文章化し、どのスケジュールで壊れるかを書きます。その後に分離レベル、原子的なUPDATE、ロック、OCC、Serializableを選びます。
レプリケーション遅延とフェイルオーバーを理解したい
Section titled “レプリケーション遅延とフェイルオーバーを理解したい”受信、書き出し、再生のどこまで進んだか、コミット時にどの確認応答を待つか、古い主系をどうフェンシングするかを確認します。
シャーディングを検討している
Section titled “シャーディングを検討している”シャーディング前に、単一ノード垂直拡張、インデックス、キャッシュ、読み取りレプリカ、アーカイブ、パーティション表で解決できないボトルネックか測定します。
マイクロサービスの整合性を設計したい
Section titled “マイクロサービスの整合性を設計したい”「結果整合性」で済ませず、各状態、外部から見える中間状態、タイムアウト、再試行、補償、手動復旧を障害マトリクスへ書きます。
製品共通原理と実装差
Section titled “製品共通原理と実装差”本書は共通原理を中心にし、製品固有の例を区別しています。特に次は同じ語でも構造が異なります。
| 項目 | PostgreSQL | MySQL/InnoDB | LSM系DB |
|---|---|---|---|
| 表の配置 | ヒープ + 別インデックス | 主キー クラスタ化葉に行 | Memtable + SSTable群 |
| 副系位置情報 | ヒープTID | 主キー 値 | キー/バージョン/LSM内位置 |
| MVCC古いバージョン | ヒープタプルバージョン | 取り消し連鎖 | 連番/バージョン + 削除マーカー等 |
| 保守 | 不要版の回収、チェックポイント | 不要版の削除、チェックポイント | コンパクション |
| レプリケーション基底 | WALストリーミング/論理 | バイナリログ/再実行系 | 複製ログ/エンジン固有 |
| Serializable | SSI等 | ロック/MVCC、設定依存 | 製品固有のプロトコルに依存 |
バージョンによって挙動は変わります。実運用では必ず使用バージョンの公式文書と実行計画を確認します。
本文の概念を観察する最小環境として、コンテナまたは局所PostgreSQLを利用できます。
試す項目:
- EXPLAIN (解析, BUFFERS)
- 複合インデックス追加前後
- work_memを変えたソートディスク退避
- 二セッションで更新消失/デッドロック
- pg_locks、pg_stat_activity
- 長時間トランザクションと不要版の回収
- WAL/チェックポイント統計
- ストリーミングレプリケーションの遅延
- バックアップ + PITR
実験値はハードウェア、キャッシュ、データ分布で変わります。結果だけでなく、データ量、バージョン、設定、キャッシュ状態、実行回数を記録します。
読むべき一次資料
Section titled “読むべき一次資料”関係とクエリ
Section titled “関係とクエリ”- E. F. Codd, “A Relational Model of Data for Large Shared Data Banks”
- Goetz Graefe, “Query Evaluation Techniques for Large Databases”
- Surajit Chaudhuri, “An Overview of Query Optimization in Relational Systems”
- Patrick O’Neil et al., “The Log-Structured Merge-Tree”
- PostgreSQL: Database Page Layout
- RocksDB Wiki
トランザクションと復旧
Section titled “トランザクションと復旧”- Hal Berenson et al., “A Critique of ANSI SQL Isolation Levels”
- Michael J. Cahill et al., “Serializable Isolation for Snapshot Databases”
- C. Mohan et al., “ARIES”
分散システム
Section titled “分散システム”- Raft Paper
- Dynamo Paper
- Spanner Paper
- Gilbert and Lynch, CAP proof
- Gray and Lamport, Consensus on Transaction Commit
- Garcia-Molina and Salem, Sagas
公式文書を読むとき
Section titled “公式文書を読むとき”次を分けます。
- 保証:何をコミット済み、可視、永続化済みと定義するか
- 既定値:初期設定でどの保証が有効か
- 仕組み:ロック、バージョン、ログ、クォーラムなどの実装
- 障害:ノード/ネットワーク/ストレージ障害時の挙動
- 操作:バックアップ、更新、フェイルオーバー、監視
機能一覧だけでなく障害意味論を読みます。
ベンチマークの注意
Section titled “ベンチマークの注意”- データ集合がメモリへ収まるか
- 温/低温キャッシュ
- 読み取り/書き込み比率
- キー/データ偏り
- トランザクション大きさ
- 同時実行性
- 永続性設定
- レプリカ/確認応答条件
- コンパクション/チェックポイント中か
- 裾の遅延時間
永続性を無効化したベンチマークと本番環境設定を比較しません。平均処理量だけでなくp95/p99、資源、バックグラウンド処理を記録します。
学習の完成条件
Section titled “学習の完成条件”次を一つのリクエストについて説明できれば、本書の概念が接続されています。
- 論理スキーマと制約
- レコード/ページ/インデックス配置
- SQLから論理/物理計画
- 走査/結合/集約のデータ流れ
- 並行するトランザクションとの競合
- コミットとWAL書き出し
- クラッシュ後の再実行/取り消し
- レプリカへのコミット/適用
- シャード振り分け
- サービス横断障害と冪等な復旧
18章の総合演習を、自分のサービスのリクエストへ置き換えて図にしてください。