A paginação é difícil; o modelo RDBMS não é adequado para um grande número de consultas de curta duração com rolagem com estado. Como você observou, o uso de recursos tende a ser muito alto.
Você tem as opções:
LIMITeOFFSET- Usando um cursor
- Copiar os resultados para uma tabela temporária ou para o memcached ou similar e depois lê-los a partir daí
x > ideLIMIT
Destes, prefiro
x > id com um LIMIT . Basta lembrar o último ID que você viu e pedir o próximo. Se você tiver uma sequência monotonamente crescente, isso será simples, confiável e, para consultas simples, será eficiente.