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