DBサーバ — データを整理して保管する係

上級の解説は準備中のため、上級の内容を表示しています。

概要 — まず全体をつかむ

中級ではインデックス・ACID・実行計画を見ました。上級では、同時実行・耐久性・分散の内部へ。

詳細 — 1段階ずつ追う

同時実行制御の実装

多数のトランザクションが同時に走る中で、正しさ(分離性)をどう保つか。

  • MVCC — 行の複数版を保持し、読み手はスナップショットを読む。読み書きが互いをブロックしにくい
  • ロックとラッチ — 論理的な整合のためのロックと、内部データ構造を守る短命のラッチは別物
  • 分離レベルの実体 — READ COMMITTED / REPEATABLE READ / SERIALIZABLE を、MVCCやロックでどう実現するか

1クエリが実行されるまで

  1. パース — SQLを構文木に
  2. オプティマイザ — 統計情報をもとにコストベースで複数の実行計画を比較し、最良を選ぶ
  3. 実行計画 — インデックス走査/シーケンシャルスキャン/各種JOIN(ネステッドループ・ハッシュ・マージ)を組む
  4. 実行 — バッファプール(メモリ上のページキャッシュ)を介してストレージにアクセス
  5. コミットWAL に先行して記録し、耐久性を確保

内部構造とアクセス

  • B+木 — 葉に実データ(またはポインタ)を並べ、範囲検索と順次走査に強い
  • インデックス種類 — B+木のほか、ハッシュ、GiST、全文、カバリングインデックス
  • 分離の異常 — ダーティリード/ノンリピータブルリード/ファントム。どれを許すかが分離レベル
  • 統計とプラン — 統計が古いと最適でない計画を選ぶ(プラン劣化)
  • バッファ管理 — ページの置き換え、チェックポイント、ダーティページのフラッシュ

分散という次の壁

  • レプリケーション — 同期/非同期。非同期は遅延(レプリカラグ)で古い読みが起きる
  • シャーディング — キーで分割。クロスシャードのJOINやトランザクションが難所
  • 合意 — 分散で1つの真実を決めるための Raft/Paxos
  • CAP/PACELC — 分断時に一貫性か可用性か。平常時も遅延と一貫性のトレードオフがある
  • ホットスポット — 特定キーへの集中で、分割しても偏る

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. コミットを「まず先行ログに追記して耐久性を確保し、本体は後で反映」する仕組みは?

2. 「読み手はロックを待たず、書き込みの前の版(スナップショット)を読む」同時実行制御は?

3. コストベースのオプティマイザが実行計画を選ぶ基準として正しいのは?

4. B+木インデックスが特に強いのはどれ?

5. 1トランザクション内で同じ行を2度読むと、間に他が更新して値が変わってしまう分離異常はどれ?

6. 分散環境で複数ノードが「1つの真実」を一致して決めるための合意アルゴリズムはどれ?

7. ネットワーク分断が起きたとき、一貫性(C)と可用性(A)のどちらかしか選べないことを示す定理を英字3文字で答えてください。

8. 非同期レプリケーションで、複製先(レプリカ)が本体より遅れて古い状態になる、その遅延を何と呼ぶか(カタカナで)。