たぶん、うまく修正できた
昨日の、
count(*) で分割して limit offset
から、
max(行番号) で分割して between
は、やっぱいまいちだったんだが、
limit offset
だと、
offset位置まで全部読むので、後ろのほうが遅くなってた。
between
だと、
指定範囲しか読み込まないから後方でも安定するが、
行番号はautoincrementの主キーだが、
複合キーがあるなら別だが、
betweenの他に条件がある場合、主キーから範囲抽出した後でディスクからwhereしなければいけないので、
50000行ディスクからwhereするとかなりきつい。
using indexになるなら50000行でも問題ない。
ってことだね。
だから、
autoincrementの主キーだけで抽出できる場合は、betweenなら後方でも安定する。
その他の場合は複合キーを用意すればいいのだが、
autoincrementの主キーと抽出用のキーを入れたインデックスは、
主キーがbigintだとかなりのサイズになるので避けたい。
ってわけで、
主キーだけで抽出できない場合は、
50000行じゃなくて5000行単位で分割すれば、
どの位置でもインデックスから5000行抽出した後で追加条件をディスクからのwhereで済むから安定するね。
これでも2秒は厳しい場合もあるかとは思うが、
安定してそこそこの速度出るはずだから、
40秒超えとかでタイムアウトするようなことはないはず。