INDEXが使われない例

以下のような一見普通の条件の時でも、単純にWHERE句の項目にINDEXをつけても使われないことがある。

  • 100件を上限とする
  • メインテーブルの主キーでorder byをする
  • 検索条件をa = /*condition*/とする

    select * from table_x where a = /*condition*/'' order by pk limit 100;

a = /*condition*/に合致する総件数がかなり多い場合、aにINDEXをつけても利用されない、あるいは利用されても効率が悪いことがある。
aのINDEXが利用されない時、pkのINDEXを利用して、pkのはじめから順にa = /*condition*/かどうかを見ていくからで、pkの後半にしかa = /*condition*/を満たすデータがなければ、全行検査していることとほぼ同じになってしまう。

対策

SQLを高速化するINDEXの付け方がある。

(a, pk)の複合INDEXにする。

(a, pk)の複合INDEXのはじめから100件とってくるだけなので、このINDEXが利用されたときは、かなり高速。
ただし、aでbetweenやinを利用してaが多岐にわたったデータが取得されるような場合等は、取得したデータがpk順に並んでいるかどうか不明のため意味がない。

備考

動作確認環境

  • PostgreSQL 9.2

類似記事