order byにインデックスが効かないケースの前に・・・order byにインデックスが使用されるのは、どんな時?
- 単独でインデックスが張られているカラムをorder byに指定したとき。
- Where節内で使用したカラムとorder byで指定したカラムと合わせて複合インデックスが張られているとき(ただし、Where内では定数が指定されていること)
この通りに指定してもインデックスが効かないケースがあります。
それが下記です。
※ key1はkey_part11で構成されるインデックス、key2はkey_part21とkey_part22で構成されるインデックスとしています。
- order by句に複数のインデックスを使用する
SELECT * FROM t1 ORDER BY key_part11, key_part21, key_part22;
この例では2つ以上のインデックスをorder by句に使用していますね。
- 連続しないキー部分に対してorder byを実行する
SELECT * FROM t1 WHERE key_part21='hoge' ORDER BY key_part22;
key2はkey_part21とkey_part22で構成されるインデックスですが、key_part21とkey_part22がwhere句とorder by句で使用されているので、「連続しないキー」に該当します。
- ASCとDESCを混在させる
SELECT * FROM t1 ORDER BY key_part11 DESC, key_part12 ASC;
これは言わずもがなですね。ASCとDESCが混在しています。
- whereで使用されるキーとorder by句で使用されるキーが違う
SELECT * FROM t1 WHERE key_part21='hoge' AND key_part22='fuga' ORDER BY key_part11;
この例ではwhere句でkey2が、order by句でkey1が使われています。こういったケースではインデックスが効きません。
- ORDER BYで多くのテーブルとカラムを結合していて、それら全てがレコードの取り出しに使用される最初の非 const テーブルではない場合
- ORDER BY とGROUP BY式が異なる場合。
SELECT * FROM t1 GROUP BY key_part11 ORDER BY key_part21, key_part22;
この例ではgroup by句でkey1が、order by句でkey2が使われてるためインデックスが効きません。
- 使用されたテーブルインデックスが、並び順にレコードを格納していないインデックスタイプの場合。(MEMORYテーブルの HASHインデックスなど)。
EXPLAINにかけてみて、order byにインデックスを使用したつもりでも効いていなかったら一度上記を見直してみてください。