質問: MySQLのLIMIT句についての質問です。バージョン5.0.22です。 現在DBに1000万件ほどの簡単なデータを入れ色々とテストを行っているのですが、以下のような時、どうしても処理が遅くなってしまいます。これは「LIMIT」の仕様でしょうか。「id」は主キーで「hoge」はテーブル名です。 mysql> SELECT * FROM hoge ORDER BY id DESC LIMIT 9000,10; 10 rows in set (8.30 sec) なお、オフセットの部分が0〜1000くらいでしたら問題ない速度です。 mysql> SELECT * FROM hoge ORDER BY id DESC LIMIT 0,10; 10 rows in set (0.00 sec) mysql> SELECT * FROM hoge ORDER BY id DESC LIMIT 1000,10; 10 rows in set (0.05 sec) 9000から9010行目までの範囲をサクッと取り出せるのが理想なのですが、たった10行を取り出すのに実際には9010レコードを走査してしまっていているようです。これは仕方のないことなのでしょうか?何か良い方法があればご教授ください。実際のクエリーをお知らせ頂くと大変助かります。 なお、こんな記事も見つけましたが、出来ればデフォルトのMYSQLのみで何とかしたいと思います。。 以上、よろしく願い致します。
回答: ■仕様 SELECT * FROM hoge ORDER BY id DESC の返してきた結果セットに対して LIMIT が働く。 ↓ SELECT * FROM hoge ORDER BY id DESC までの部分ではインデックスの有無で処理速度が大きく変わるけれども LIMITの時点ではインデックスの有無は既に関係無い状態。 ■対処 WHEREで結果セットを少なくするしかないでしょう。idを利用して絞り込む方向で考えてみてください。 データの抹消などもあってidが一部欠如する場合もあるかとは思いますが、 その部分はイレギュラー処理(結果がゼロ件ならば再検索など)するようなロジックを組んで対処すれば良いでしょう (イレギュラー処理を行っても8.3secよりは十分に高速だと割り切るしかない)