簡単な答えはORDER BY
、ファイルソート操作を要求するのではなく、インデックスを使用して満足できることを確認することです。
EXPLAIN SELECT ... を使用して、クエリ プランを取得できます。
EXPLAIN
SELECT t.*
FROM mytable t FORCE INDEX FOR ORDER BY (mytable_IX1)
WHERE t.created_at > @last_created_at
OR t.created_at = @last_created_at AND t.id > @last_id
ORDER BY t.created_at, t.id
LIMIT 1000
id select_type table type possible_keys key key_len ref rows Extra
-- ----------- ------ ----- ------------- ----------- ------- ------ ---- -------------
1 SIMPLE t range mytable_IX1 mytable_IX1 13 (NULL) 1000 Using where; Using index
最初の実行では、t.created_at IS NOT NULL
述語のみが必要です。後続の実行では、フェッチした最後の行の列の値を渡すため、その時点から次のクエリを開始します。