INDEXが使われない例

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

  • 画面は100件表示のページング機能付きとする。
  • メインテーブルの主キーでorder byをする。
  • 検索条件をAとする。
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を利用して多岐にわたってデータが取得されるような場合等は、取得したデータがpk順に並んでいるかどうか不明のため、意味がない。