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

インデックスの役割

インデックスの効きどころ

1000 万行から 1 件を、毎回先頭から数える

技術書の巻末には索引が付いています。「デッドロック」という語がどこに出てくるかを知りたいとき、500 ページを 1 ページずつめくる人はいません。索引を引いて、書いてあるページだけを開きます。

索引のないテーブルは、この巻末索引がない本と同じです。1000 万行の利用者の表から 1 件を取り出すとき、DB は先頭の行から順に値を比べていきます。目的の行が最後にあれば 1000 万回の比較が要ります。1 回 1 マイクロ秒でも 10 秒です。

索引を貼るというのは、本文とは別に「その列の値と、行のありか」を値の順に並べた一覧を持つことです。並んでいるので、端から見ていく必要がありません。

ここで効いているのは、並んでいるという性質だけです。並んでいれば、真ん中を見て前半か後半かを決められます。決めるたびに候補が半分になるので、1000 万件でも 24 回ほどで 1 件まで絞れます。あとは、そこに書いてある行のありかを辿るだけです。

索引を足すと、書き込みが遅くなる

ここで止めると片手落ちです。本に索引を付けるということは、本文を 1 行足すたびに索引も直す、ということでもあります。

DB でもまったく同じです。1 行追加するたびに、その表に貼ってある索引を全部更新します。索引が 5 つあれば、書き込みのときに直す場所が 5 か所増えます。値を書き換えたときも、その列を含む索引は並び直しが必要です。索引を増やすほど読み取りは速くなり、書き込みは確実に遅くなります。

容量も増えます。索引はそれ自体がデータなので、列の多い表にいくつも貼ると、索引の合計が本体と同じくらいの大きさになることもあります。よく使う索引はメモリにも常駐するので、そのぶん他のものが乗らなくなります。

主キーには、宣言した時点で索引が自動的に作られます。重複していないことを確かめるには、結局その列を探せる必要があるからです。重複を許さない制約も同じで、制約と索引はここで一体になっています。

使われていない索引は、書き込みを遅くしているだけの存在です。貼りっぱなしにせず、消す判断もします。索引はデータそのものではなく、データへの道順です。消してもデータは 1 件も減りませんし、あとから貼り直せます。効いているか分からない索引は、消して測ってみるのがいちばん早い確かめ方です。

性別に索引を貼っても、ほとんど効かない

貼れば速くなる、でもありません。効くかどうかは、その列で行がどれだけ絞れるかで決まります。

性別のように値が 2 種類しかない列を考えます。索引を引いて「該当する行のありか」を得ても、それが全体の半分あります。半分の行を、索引が示す場所を頼りにばらばらに読みに行くくらいなら、本体を頭から順に読んだほうが速い。飛び飛びに読むより、続けて読むほうがディスクにとって都合がよいからです。DB 自身もそう判断して、索引を使わないことがあります。削除フラグや、ほとんどが同じ値の状態列も同じです。

逆に候補になるのは、値の種類が多くて絞り込みが効く列です。検索条件によく出てくる列、他の表とつなぐときの相手側の列、並べ替えに使う列が該当します。

複数の列をまとめて 1 つの索引にすることもできます。このとき順番に意味があります。姓と名でこの順に並んだ電話帳から、名前だけを頼りに人を探すことはできません。同じように、先頭の列が条件に含まれていない検索では、その索引は使われません。

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

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

  • デッドロック複数トランザクションが互いの解放を待ち、永遠に止まる状態
  • ロック「他の人触らないでね」と DB に予約する
  • テーブルDB の表 (Excel のシートみたいなもの)
  • メモリプログラムとデータを一時保持する高速領域
  • 外部キーテーブル同士を結びつける鍵
  • 主キーレコードを一意に特定する列
  • 判断YES/NO 分岐を表す菱形
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • B-tree の仕組み

    多分木である B-tree がなぜディスクに向くかを学ぶ

  • B+tree(実際の DB 実装)

    リーフを連結リストで結ぶ B+tree が範囲検索に強い理由

  • ハッシュインデックス

    等価検索専用の高速インデックスとその制約

  • カバリングインデックス

    テーブル本体を読まずに済む複合インデックス設計

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

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