👋

部分インデックス

2025/03/09に公開

Daily Blogging78日目

インデックスの中には、部分インデックスというものもあるらしい

部分インデックス??

複合インデックス、カバリングインデックスなどは聞いたことがあったけど
部分インデックスは初めて聞いた
https://use-the-index-luke.com/ja/sql/where-clause/partial-and-filtered-indexes

簡単にいうと、特定の条件に合う値に対するインデックスのこと

通常のインデックス

カラムを指定したらそのカラムの値全部を含んだインデックスを作成する

CREATE INDEX idx_users_email ON users (email);

これだとusersテーブルのemailカラムに対してインデックスが作成され、
そのB-treeにはemailの値が全部含まれる

部分インデックスの場合

条件を指定して、その条件にマッチする値を含んだ行のカラムのインデックスを作成する

CREATE INDEX idx_users_active ON users (id)
WHERE status = 'active';

この場合、statusがactiveになっている行のidに対してのみインデックスを作成する

メリット

部分インデックスを使うと何が嬉しいのか

  • インデックスファイルのサイズが小さくなる
  • 更新時のコストが下がる
  • 条件にマッチしたwhere句に対して検索効率が上がる

有効なタイミング

あるテーブルに対して、基本的に特定の条件でしかデータを取得しない場合に有効

特定の期間のデータしか取得しない

CREATE INDEX idx_orders_recent_shipped ON orders (shipped_at)
WHERE shipped_at > '2025-01-01';

NULLは取得しないとき

CREATE INDEX idx_orders_shipped ON orders (shipped_at)
WHERE shipped_at IS NOT NULL;

とかとか

ポイントは、

  • 部分インデックスを使うことで、通常のインデックスよりインデックスサイズが小さくなるか
  • その条件でのみよく検索されるか

Discussion