Есть некий исходный запрос Q, сейчас я делаю
1) select count(*) as total from (select * from (Q) t)
2) Q limit ? offset ?
Из-за этого время выполнения увеличивается минимум в 2 раза.
Если делать пагинацию программно - что-то вроде _.drop(data, offset).slice(0, pageSize) - то выходит быстрее, но если там пара миллионов строк - то, наверное, это плохое решение.
Какие существуют хорошие практики для пагинации? В идеале хотелось бы, чтобы total и все остальное выполнялись за 1 запрос и чтобы mysql как-то кэшировал результаты для запросов, где меняется только offset...
Или все же правильно делать пагинацию на стороне ноды?
Проблема в подсчете общего кол-ва записей для пагинации? А в чем смысл делать несколько уровней вложенных друг в друга запросов, чтобы просто подсчитать COUNT? Или там какие-то еще условия есть?
Вы не поверите, но mysql умеет и кэширует запросы. Но в вашем случае либо проблема в таблице (индексы), либо в данных (если там text то прощай индексация). В любом случае прочитайте explain и если там нет проблем или вас ничего не смутило - кэшируйте результаты в memcached, например, самостоятельно