【ぶぶんインデックス】

部分インデックス とは?

公開:
💡 「必要な行だけ」を束ねる、賢いインデックスの選抜制度。
📌 このページのポイント
部分インデックス(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(索引)の組み合わせ。テーブル全体ではなく一部の行だけに索引を作るイメージだよ。
← 用語集にもどる