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

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

💡 テーブルに聞きに行かなくても索引だけで全部分かる優等生
📌 このページのポイント
カバリングインデックス vs 通常インデックス 通常のインデックス クエリ SELECT name インデックス (statusのみ) 遅い テーブル本体 nameを取得 ← ランダムI/O発生 カバリングインデックス クエリ SELECT name インデックス (status, name) 完結! テーブル不要 EXPLAIN で確認 MySQL: Using index PgSQL: Index Only Scan 読み取り高速(ディスクI/O削減) 注意: インデックスサイズ増 / 更新コスト増
カバリングインデックスのイメージ
ひよこ ひよこ

カバリングインデックスって普通のインデックスと何が違うの?

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

普通のインデックスはキーで行の場所を見つけた後、テーブル本体にデータを取りに行く必要があるんだ。カバリングインデックスはインデックス自体に必要なデータが全部入っているから、テーブルを見に行かなくていいんだよ。図書館で言えば、目次カードだけで本の中身まで分かるようなものだね

ひよこ ひよこ

どれくらい速くなるの?

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

テーブルへのランダムアクセスはディスクI/Oの中でも特に遅い処理だから、それをゼロにできるのは大きいよ。特に大量の行をスキャンするクエリだと10倍以上速くなることもあるんだ

ひよこ ひよこ

どうやって作るの?

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

MySQLならCREATE INDEXで検索条件のカラムだけでなく、SELECTで取得するカラムも含めるんだ。たとえばSELECT name, age FROM users WHERE status = 1なら、CREATE INDEX idx ON users(status, name, age)とすればカバリングインデックスになるよ

ひよこ ひよこ

全部のカラムを入れちゃえば最強じゃない?

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

そう思いたくなるけど、インデックスカラムを追加するほどサイズが大きくなってINSERTやUPDATEが遅くなるんだ。読み取りは速くなるけど書き込みは遅くなるトレードオフがある。よく使うクエリに絞って設計するのがプロの腕の見せどころだね

ひよこ ひよこ

ちゃんとカバリングインデックスが使われてるか確認する方法はある?

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

EXPLAIN文で実行計画を見ればわかるよ。MySQLならExtraカラムにUsing indexと出ればカバリングインデックスが効いている証拠だ。PostgreSQLならIndex Only Scanと表示されるよ。パフォーマンスチューニングではEXPLAINを読む力がめちゃくちゃ大事なんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
カバリングインデックスって出てきたら「インデックスだけでクエリが完結する高速化テクニック」と思えればだいたいOK!
📖 おまけ:英語の意味
「Covering Index」 = 被覆インデックス
💬 Cover(覆う)から来ていて、クエリに必要な情報を全部カバーするインデックスという意味だよ
← 用語集にもどる