発展インデックスの種類

部分インデックス

定義

部分インデックス(部分索引)とは、WHERE句のような条件を付けて特定行のみをインデックス化する方式で、サイズが小さく更新コストも低い。

「必要なところだけ」の小さいインデックス

部分インデックスは、WHERE句のような条件を付けて「該当する行だけ」をインデックスに含めます。 全体のごく一部にしかクエリが刺さらない場合、インデックスをフルサイズで作るのは無駄。 部分インデックスならサイズも更新コストも大幅に減らせます。

部分インデックス
SQL
-- 通常インデックス(全行を含む)
CREATE INDEX idx_users_email
  ON users (email);

-- 検索クエリ
SELECT *
FROM users
WHERE email = 'alice@example.com'
  AND deleted_at IS NULL;
効果

全 10 件を対象とするインデックス。削除済みユーザーの分もインデックスに含まれ、その分だけ肥大化する。

インデックス (email)
エントリ 10 / 10

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

email
deleted_at
→ 行ID
alice@example.comNULL(1,0)
bob@example.com2025-06-01(1,1)
carol@example.comNULL(1,2)
dave@example.comNULL(1,3)
eve@example.com2025-05-20(2,0)
frank@example.comNULL(2,1)
grace@example.com2025-04-10(2,2)
henry@example.comNULL(2,3)
ivy@example.comNULL(3,0)
jack@example.comNULL(3,1)
論理削除された行を除外して「アクティブなユーザーだけのインデックス」を作る典型例。インデックスサイズと更新コストを大きく減らせる。

典型的なユースケース

  • 論理削除された行を除外(最頻): (email) WHERE deleted_at IS NULL のように、ソフトデリートを採用したテーブルで「アクティブ行だけ」のインデックスを作る
  • 特定ステータスの行だけの検索: (order_id) WHERE status = 'pending' のように、頻繁に引く一部の状態だけをインデックス化
  • NULLでない値だけのユニーク: UNIQUE (email) WHERE email IS NOT NULL のように、NULLは許容しつつ入力された値だけ一意にしたいとき

注意点

  • クエリの条件と部分インデックスの条件が一致する必要がある。少しでも違うと使われない
  • 統計情報の見え方も変わるので、EXPLAINで実際に使われているか確認する

よくある疑問

Q.部分インデックスは全てのRDBMSで使える?
A.多くの主要RDBMSがネイティブでサポートしますが、対応していないRDBMSもあります。その場合は生成カラムなど別の仕組みで擬似的に実現するのが一般的です。使いたい場合はまず対象RDBMSの仕様を確認してください。
Q.どんなときに部分インデックスが有効?
A.「特定の状態の行だけをよく引く」「NULLでない値だけをユニークにしたい」「大量の履歴データの中でアクティブな一部だけをよく検索する」など、対象が全体の一部に偏っているケース。

関連トピック

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

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

オンライン個別指導

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

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

無料相談を予約する →