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

ハッシュインデックス

ハッシュと衝突

等号しか書かないなら、木を辿る必要すらない

セッショントークンから利用者を引く処理を考えます。条件は必ず完全一致で、範囲も並べ替えも一生使いません。

こういうときに木を辿るのは、少し遠回りです。境界と比べながら段を下りるのは、順序を保つための作業だからです。順序が要らないなら、値から置き場所を直接計算してしまえばよい。

ハッシュ索引はそれをやります。キーを関数に通して数値にし、その数値を並んだ入れ物の番号として使います。中にあるのは行のありかです。段数という概念がないので、件数がいくら増えても手数は変わりません。

本の索引でいえば、五十音順に並べるのをやめて、語ごとに置き場所を計算で決めているようなものです。順に並んでいないので眺めても意味を成しませんが、探したい語が分かっているなら一発で開けます。

並び順を捨てた代償

代わりに失うものがあります。ハッシュ関数は、似た値をわざと遠くに飛ばします。1 文字違うだけの 2 つのキーが、まったく別の場所に入ります。近い値が近くに置かれないということは、順序がどこにも残っていないということです。

条件の書き方B+treeハッシュ
完全一致効く効く
値の列挙効く効く
より大きい、より小さい効く効かない
ある範囲の中効く効かない
並べ替え効く効かない
前方一致効く効かない

使えるのは完全一致と、その列挙だけです。これがハッシュ索引の主役になれない理由です。

もう 1 つ、違うキーが同じ入れ物に入ってしまうことがあります。中では一覧にして順に見るので、偏りが大きいと手数が増えていきます。入れ物の数をデータ量に合わせて増やし、偏りにくい関数を選ぶことで抑えます。

ただし、入れ物を増やす作業自体が見えにくい負担です。番号の付け方が変わるので、入っている全部を計算し直して置き直します。件数の伸びが読めない用途では、この作り直しが「ときどき固まったように見える」原因になります。手数が常に一定という説明は、増えない前提での話です。

貼ったつもりが、B+tree になっていた

現場では、思ったところに存在しないことがあります。

MySQL の InnoDB は、ハッシュ索引を明示的に作らせてくれません。ハッシュを指定して書いても、黙って B+tree が作られます。代わりに、よく触られる部分を DB 自身が判断して内部でハッシュ化する仕組みが動いていますが、これは利用者が制御するものではありません。メモリ上に置くテーブルでは既定でハッシュが使われます。PostgreSQL では明示的に作れるものの、長らく実用に耐えない時期があり、いまでも既定の選択肢にはなっていません。

一方、Redis や Memcached のようなキーと値だけの倉庫は、構造そのものが巨大なハッシュ表です。キーを渡して値を受け取る操作しか用意していないので、順序を捨てた設計が最初から噛み合っています。

そう考えると、ハッシュ索引は「どの索引を使うか」の選択肢というより、順序が本当に要らない場所に現れる形と見たほうが近いです。迷ったら B+tree で困りません。順序を保つぶんの手間は払っていますが、その手間があとから効いてくる場面のほうが、実際にはずっと多いからです。

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

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

  • セッションブラウザごとに紐づくサーバー側の保管箱
  • トークンLLM が扱う最小の文字単位
  • 処理計算や代入を表す長方形
  • 関数処理に名前を付けて再利用できる単位
  • ハッシュ関数入力から固定長の値(ハッシュ値)を生成する関数。
  • treeディレクトリ構造をツリー表示するコマンド
  • MySQL広く使われるオープンソースのRDBMS
  • 判断YES/NO 分岐を表す菱形
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

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

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

  • トランザクションとは

    BEGIN / COMMIT / ROLLBACK の意味と必要性を学ぶ

  • クエリプランナの役割

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

  • レプリケーション

    Primary / Replica 構成での読み取り分散と整合性

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

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