自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。
発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全然違うんですよね・・・
試しにexplainで調べてみるとrowのところの数値がoffsetの数がそのまま入っていました。(つまりoffsetの倍数そのままになります。)
てっきりORDER BYにindexが貼られて入れば、0件目でも100万件目でも全く変わらないと思っていましたが、実は違うようです。
対策としては下記のような感じでしょうか。
- idなどの連続する値の場合はbetweenで挟む
- offsetの始点にwhere条件を切り替えて検索する
あとは遅い原因の絞り込み方としてはexplainの活用がメインになりますね。
【MySQL】遅いselect文の原因を調査する【explainの読み方】
- 基本rowsの数を少なくすることが目的
- indexが適切に貼られているか、使われているか(explainのkeyをみて値が適切かどうかを見ましょう。)
自分の場合ですが、indexが適切に貼られているにも関わらずjoinを使った場合、型が片方はintもう片方はvarcharで高速化できない、ということがありましたまあ珍しいケースではあると思いますが、遅い場合には見ておきましょう。