【かばりんぐいんでっくす】
カバリングインデックス とは?
最終更新:
💡 必要な列を索引にそろえ、本体の参照を減らす
カバリングインデックスは、あるクエリに必要な列を含むインデックス。テーブル本体の参照を減らせますが、効果はDBと実行計画によります。MySQLのUsing indexとPostgreSQLの可視性確認の違いを解説します。
📌 このページのポイント
- あるクエリが必要とする列をインデックスでまかなう設計
- 同じインデックスでも、どのクエリをカバーするかは異なる
- PostgreSQLのIndex Only Scanでも可視性の確認で本体を参照する場合がある
- 追加した列の容量・更新負担と、実際の読取りの効果を比較する
カバリングインデックスって何?
作り方の例を教えて!
テーブル本体は絶対に読まなくなる?
DBによるよ。PostgreSQLは索引に値がそろっていても、その行が今のトランザクションから見えるかを確認する。visibility mapで全行が可視と分かるページなら本体を見ずに済むけれど、そうでなければ本体へのアクセスが必要なんだ。
どうやって効果を確認するの?
必要そうな列を全部追加すればいい?
追加すると索引が大きくなり、書込みの負担や検索の効率にも影響するよ。PostgreSQLなら検索キーとは別の列をINCLUDEで持たせる方法もある。頻繁なクエリに絞り、実行時間や読取り量、書込みへの影響を測って判断しよう。何倍速くなると一律には言えないんだ。
もっと詳しく知りたい人へ
MySQLのUsing index conditionも、カバリングの証拠?
違います。Using index conditionは、まずインデックスの値で条件を評価し、必要な場合に行本体を読み出すIndex Condition Pushdownを表します。Using indexとは区別してください。また、索引だけを使っても大量のエントリを調べる計画なら速いとは限らず、読取り件数や実行時間も確認します。
まとめ:ざっくりこれだけ覚えればOK!
「カバリングインデックス」って出てきたら「そのクエリに必要な列を含む索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Covering Index」 = 被覆インデックス
💬 Cover(覆う)から来ていて、クエリに必要な情報を全部カバーするインデックスという意味だよ