【かばりんぐいんでっくす】

カバリングインデックス とは?

最終更新:
💡 必要な列を索引にそろえ、本体の参照を減らす

カバリングインデックスは、あるクエリに必要な列を含むインデックス。テーブル本体の参照を減らせますが、効果はDBと実行計画によります。MySQLのUsing indexとPostgreSQLの可視性確認の違いを解説します。

📌 このページのポイント
カバリングインデックス:必要な列を索引に取得:name・age / 条件:status索引の候補:(status, name, age)MySQL 8.4Using index索引から列を取得計画と負荷で速さを確認PostgreSQL 18Index Only Scan可視性の確認が必要本体を読む場合もある列を増やすと容量・更新の負担にも影響実行計画と計測結果で判断
あるクエリとの関係を示す索引設計の例です。DBごとに条件と確認方法が異なり、索引を用意しただけでは利用や高速化は保証されません。
ひよこ ひよこ
カバリングインデックスって何?
ペンギン先生 ペンギン先生
あるクエリの検索や取得に必要な列をインデックス内でまかなえるようにすることだよ。特別な種類の索引というより、そのクエリとの関係を指す。同じ索引でも、別の列を取得するクエリまではカバーできないことがあるね。
ひよこ ひよこ
作り方の例を教えて!
ペンギン先生 ペンギン先生
例えばMySQLでSELECT name, age FROM users WHERE status = 1というクエリなら、users(status, name, age)への複合インデックスが候補になるよ。statusで探し、nameとageも索引から得る設計だね。ただし実際にその索引を使うかは実行計画を確かめよう。
ひよこ ひよこ
テーブル本体は絶対に読まなくなる?
ペンギン先生 ペンギン先生
DBによるよ。PostgreSQLは索引に値がそろっていても、その行が今のトランザクションから見えるかを確認する。visibility mapで全行が可視と分かるページなら本体を見ずに済むけれど、そうでなければ本体へのアクセスが必要なんだ。
ひよこ ひよこ
どうやって効果を確認するの?
ペンギン先生 ペンギン先生
MySQLのEXPLAINではExtraのUsing indexが、索引の情報だけで列を取得する方式を示す。Using index conditionは別の意味だよ。PostgreSQLではIndex Only Scanと、EXPLAIN ANALYZEのHeap Fetchesなどを確認する。ANALYZE付きは実際にクエリを実行するので、負荷や副作用にも注意しよう。
ひよこ ひよこ
必要そうな列を全部追加すればいい?
ペンギン先生 ペンギン先生
追加すると索引が大きくなり、書込みの負担や検索の効率にも影響するよ。PostgreSQLなら検索キーとは別の列をINCLUDEで持たせる方法もある。頻繁なクエリに絞り、実行時間や読取り量、書込みへの影響を測って判断しよう。何倍速くなると一律には言えないんだ。
もっと詳しく知りたい人へ

MySQLのUsing index conditionも、カバリングの証拠?

違います。Using index conditionは、まずインデックスの値で条件を評価し、必要な場合に行本体を読み出すIndex Condition Pushdownを表します。Using indexとは区別してください。また、索引だけを使っても大量のエントリを調べる計画なら速いとは限らず、読取り件数や実行時間も確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カバリングインデックス」って出てきたら「そのクエリに必要な列を含む索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Covering Index」 = 被覆インデックス
💬 Cover(覆う)から来ていて、クエリに必要な情報を全部カバーするインデックスという意味だよ

参考資料

← 用語集にもどる