インデックスを使用できないからではありません。これは、インデックスを使用せずにファイルソートを実行する方が高速であるとオプティマイザが判断したためです1。MyiSAM テーブルと InnoDB テーブルでは異なる動作が見られるはずです。
InnoDB はPRIMARY
キーをクラスター化されたもの (UNIQUE
プライマリが定義されていない場合は最初のキー) として作成します。これは、必要なすべての値がこのクラスター化されたキーと連続した場所にある (クラスター化されたキーはテーブルです) クエリにORDER BY pk
使用WHERE pk BETWEEN low AND high
できます。 .
MyISAM テーブルには B ツリー インデックスしかないため、クエリがこのインデックスを使用する場合、そのインデックス全体を読み取る必要がありcomment_id
、必要な順序で値が含まれます (これは非常に良いことです) が、テーブルも読み取る必要があります。 (あまり良くありません)他のすべての必要な列を取得します。オプティマイザーは、これからテーブルを読み取るので、すべてをスキャンしてファイルソートを実行しないのはなぜでしょうか? 次のことを試すことで、それをテストできます。
SELECT comment_id FROM comments ORDER BY comment_id ;
クエリはインデックスに格納されている値のみを必要とするため、インデックスを使用し、ファイルソートは行いません。
MyiSAM で同様の (InnoDB と) 動作が必要な場合は、インデックスを作成して(comment_id, comment_content, comment_author, comment_author_url)
からクエリを試すことができます。必要なすべての値がインデックス上で正しい順序で見つかるため、ファイルソートは実行されません。
もちろん、追加のインデックスには、テーブルとほぼ同じディスク容量が必要です。
1 : ファイルソートは常に悪いわけではなく、ファイルがディスクに保存されるという意味でもありません。データのサイズが小さい場合は、メモリ内で実行されます。