基礎インデックスの種類

ユニークインデックス

定義

ユニークインデックスとは、対象カラム(複合の場合は組合わせ)の値が重複しないことを保証するインデックスであり、探索の高速化と制約の両方を実現する。

「同じ値は入れさせない」という保証

ユニークインデックスは検索の高速化に加え、そのカラムの値が重複しないことを保証する制約として機能します。 メールアドレス、ユーザー名、注文番号のように「1つしかあってはいけない値」に付与します。

ユニークインデックスによる重複防止
SQL
-- インデックス定義
CREATE UNIQUE INDEX idx_users_email
  ON users (email);

-- 挿入
INSERT INTO users(email)
VALUES ('a@example.com');
仕組み

INSERT時、DBはまずUNIQUEインデックスを引いて既に同じ値があるか確認する。 存在すればエラーを返し、なければテーブルとインデックスに書き込む。

インデックス (email) UNIQUE

※ ここでは分かりやすさのためソート済みリスト風に描いているが、 実際はB-treeで保持されるので探索は O(log N)。 詳しくは B-treeの仕組み へ。

email
→ 行ID
a@example.com(1,1)
b@example.com(1,3)
c@example.com(1,0)
d@example.com(1,2)
テーブル users
物理配置(挿入順)
行ID
email
(1,0)c@example.com
(1,1)a@example.com
(1,2)d@example.com
(1,3)b@example.com
UNIQUEインデックスは検索の高速化と同時に、値の重複を防ぐ制約としても機能する。 INSERT時にインデックスで存在チェックが O(log N) で走る。

裏でどう動いているか

INSERT時、DBはまずインデックスを引いて「同じ値が既に存在しないか」を確認してから挿入します。 存在すればエラーを返し、無ければインデックスとテーブルの両方に書き込みます。 検索の高速化のためのインデックスが、そのまま制約チェックにも使われる、賢い仕組みです。

使い所

  • メールアドレスや外部システムのID(自然キー)
  • 複合ユニーク: (user_id, role_id) のような組み合わせで一意にしたいペア
  • 論理削除がある場合は「未削除の中で一意」にしたいことが多く、部分ユニークが検討候補

よくある疑問

Q.ユニークインデックスとUNIQUE制約は同じもの?
A.実装上はほぼ同じで、UNIQUE制約は内部的にユニークインデックスを作成します。DDLの書き方の違いくらいに考えて構いません。
Q.NULLは重複としてカウントされますか?
A.SQL標準では、NULL同士は互いに異なる値として扱われるため、複数のNULLが許容されます。ただしRDBMSによってはこの挙動が異なる場合があるため、使いたい仕様であれば事前に確認が必要です。
Q.主キーとユニークインデックスの違いは?
A.主キーはNULLを許さず、テーブルに1つだけ。ユニークインデックスはNULLを許し、複数貼れます。両方とも「重複させない」ための仕組みという点は共通です。

関連トピック

もっと学びたい方へ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。購入いただくと運営者に紹介料が入る場合があります。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →