【ぶぶんインデックス】

部分インデックス とは?

最終更新:
💡 よく探す一部の行に、検索用の目印を

テーブルのうち、指定した条件を満たす行だけで作るデータベースのインデックス。未処理の注文など、一部の行をよく検索する場合に使える。検索条件からインデックスの対象条件を満たすと判断できる必要があり、速さや容量削減の効果はデータとクエリによる。

📌 このページのポイント
部分インデックス:対象の行を絞る注文テーブル状態   user_idactive   101shipped   103active   205索引101205対象条件:status = 'active'対象外の行も、テーブルには残るよ
activeの行だけにuser_idの索引を作る例。クエリが対象条件を満たすと判断できる必要があります。
ひよこ ひよこ
全部の行に、インデックスを作らないの?
ペンギン先生 ペンギン先生
指定した条件に合う行だけを対象にするよ。たとえば注文の中で、statusがactiveの行だけに、user_idのインデックスを作る。処理済みの注文もテーブルには残り、インデックスの対象から外れるだけ。元の行を削除する仕組みではないんだ。
ひよこ ひよこ
どんなSQLで作るの?
ペンギン先生 ペンギン先生
PostgreSQLやSQLiteなら、例としてCREATE INDEX orders_active_user_idx ON orders(user_id) WHERE status = 'active';と書けるよ。検索用に登録する列はuser_idで、対象の行を絞る条件はstatus。索引の列と、条件で使う列が同じである必要はないんだ。
ひよこ ひよこ
user_idを検索すれば、いつでも使われる?
ペンギン先生 ペンギン先生
この例では、active以外の行が索引にないので、user_idだけを条件にした検索にそのまま使えるとは限らないよ。status = 'active'も指定するなど、対象条件を満たすとデータベースが判断できることが必要になる。判断や採用はクエリの形、計画、データなどにも左右されるんだ。
ひよこ ひよこ
対象が少なければ、必ず速く小さくなる?
ペンギン先生 ペンギン先生
対象の行を減らすことで容量や更新の負担を減らせる場合はあるよ。ただし行数の割合が、そのままファイル容量の削減率になるわけではないし、すべての検索が速くなるわけでもない。実行計画や処理時間、データの分布を確認して、必要な索引か判断しよう。
ひよこ ひよこ
条件が変わる検索では、気を付けることは?
ペンギン先生 ペンギン先生
PostgreSQLは、クエリの条件から索引の条件を満たすと証明できる必要がある、と説明しているよ。似た意味でも条件の書き方や、パラメーターを使う計画によって判断できない場合がある。SQLiteにも利用条件がある。使うDBの資料と実行計画を確認し、索引を作っただけで安心しないでね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「部分インデックス」って出てきたら「条件に合う一部の行だけに作る検索用の目印」と思えばだいたいOK!
📖 おまけ:英語の意味
「Partial Index」 = 部分的なインデックス
💬 このページではWHERE条件で対象の行を絞るインデックスを扱うよ。文字列の先頭だけを索引にする話とは別なんだ。

参考資料

← 用語集にもどる