【ぶぶんインデックス】

部分インデックス とは?

💡 「必要な行だけ」を束ねる、賢いインデックスの選抜制度。
📌 このページのポイント
部分インデックス(Partial Index) ordersテーブル status = 'active' status = 'shipped' status = 'active' status = 'canceled' status = 'shipped' WHERE status = 'active' 絞り込み 部分インデックス user_id: 101 → row 1 user_id: 205 → row 3 activeな行だけが対象 インデックスが小さい! サイズ削減・検索高速化 不要行を除外してスリムに
部分インデックスは条件に合う行だけをインデックス対象にする
ひよこ ひよこ

インデックスって全部の行に作るものじゃないの?

ペンギン先生 ペンギン先生

実は条件を付けて、特定の行だけ対象にする『部分インデックス』があるんだよ。たとえば「ステータスが active の行だけ」にインデックスを作れるんだ。

ひよこ ひよこ

全行じゃなくていいの? なんかもったいない気がするんだけど!

ペンギン先生 ペンギン先生

逆で、全行に作る方がもったいないこともあるよ。NULLだらけの列や、ほとんど使わないステータスの行までインデックスに入れると、サイズが膨らんで遅くなるんだ。

ひよこ ひよこ

じゃあ、よく使う条件の行だけに作れば小さくて速くなるんだね!

ペンギン先生 ペンギン先生

そう! PostgreSQLなら `CREATE INDEX ON orders (user_id) WHERE status = 'active';` みたいに書けるよ。activeな注文だけを対象にしたインデックスが出来上がるんだ。

ひよこ ひよこ

MySQLでも使えるの?

ペンギン先生 ペンギン先生

残念ながらMySQLは部分インデックスを標準でサポートしていないんだよ。PostgreSQLSQLiteでは使えるから、DB選びのポイントになることもあるね。

ひよこ ひよこ

NULLが多い列にも効果的って言ってたけど、どういうこと?

ペンギン先生 ペンギン先生

たとえば deleted_at 列に「NULLでない=削除済み」が1%しかなければ、NULL行をインデックスから除外できるんだ。インデックスが99%小さくなって、削除済みを検索するときだけサッと引けるようになるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「部分インデックス」って出てきたら「条件付きの絞り込みインデックス」と思えればだいたいOK!
📖 おまけ:英語の意味
「Partial Index」 = 部分インデックス
💬 Partial(部分的な)+ Index(索引)の組み合わせ。テーブル全体ではなく一部の行だけに索引を作るイメージだよ。
← 用語集にもどる