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

シャーディング

書きが重いなら、コピーを増やしても効かない

読み取りはレプリカで分散できます。しかし書き込みは Primary 1 台に集まったままです。1 台の書き込み性能が上限に来たら、コピーを増やす方向では何も解決しません。

ここで出てくるのが、データそのものを複数のサーバへ分けて持つやり方です。ユーザー ID で分けるなら、ID ごとに担当のサーバが決まり、それぞれが自分の担当ぶんの書き込みを受け付けます。台数を増やせば書き込みの上限も増えます。これがシャーディングです。

効き目は大きいのですが、順番としては最後です。クエリと索引の見直し、サーバの増強、読み取りの分散、古いデータの退避。この 4 つを試し切ってからでも遅くありません。

レプリカと違い、シャードはそれぞれ違うデータを持ちます。1 台失えば、その担当ぶんだけが丸ごと消えます。ですから各シャードをさらに複製する必要があり、台数も運用の手間も掛け算で増えていきます。

分けた瞬間に、できなくなることがある

分けると、1 台では当たり前にできていたことが急に難しくなります。

SQL クエリ

SELECT COUNT(*) FROM users WHERE created_at > '2026-05-01';

このクエリには、分割の基準になる列が出てきません。ですから全サーバへ同じ問い合わせを投げ、返ってきた数を足し上げることになります。応答時間はいちばん遅い 1 台で決まり、台数を増やすほど遅い 1 台に当たる確率が上がります。並べ替えて上位 10 件、のような問い合わせも、各サーバから 10 件ずつ集めて並べ直す必要があります。

もっと重いのは、複数のサーバにまたがる更新です。片方だけ成功した状態を防ぐには、全員に可否を確認してから確定させる手順が要り、そのぶん遅く、途中で 1 台落ちると全体が止まります。実務では、1 つのトランザクションが 1 台の中で閉じるように業務の側を設計します。

分割の基準は、あとから変えられない

いちばん怖いのはここです。分割の基準にした列は、決めた後に変えるのがほぼ不可能です。全データを別の分け方で入れ直すことになり、その間サービスを止めるか、新旧の両方へ書きながら少しずつ移す仕組みを自作するしかありません。しかもその移行の最中も、書き込みは秒間何万と流れ続けています。分けるのは簡単で、戻すのも分け直すのも極めて難しい、と覚えておいてください。

基準を間違えると偏ります。国や地域で分ければ、利用者の多い国の担当が 1 台だけ火を噴きます。登録順の範囲で分ければ、新規登録が全部いちばん新しい 1 台へ集中します。値の種類が多く、頻度が均されていて、日常のクエリの大半に出てくる列。この 3 つを満たすものを探します。

分け方そのものは 2 通りに集約されます。値の範囲で区切るやり方は、範囲を指定した検索が 1 台で済む代わりに、新しい値ばかりが増える列では偏ります。値をハッシュにかけて振り分けるやり方は均等に散る代わりに、範囲検索が全台に散らばります。どちらを選んでも、基準にした列そのものが偏っていれば偏ったままです。

解説

1 台で耐えられる間は 1 台で粘る。分けた後の開発は、確実に窮屈になる。

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

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

  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • 設計何をどう作るかを決める前工程
  • 集約複数の値を 1 つの結果にまとめる操作
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • CAP 定理

    Consistency / Availability / Partition tolerance の同時達成不可性

  • 結果整合性

    BASE と AP 系システムが選ぶ妥協と利点

  • NewSQL と分散 SQL

    TiDB / Spanner が実現する分散環境での ACID

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

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