У меня есть набор данных в MySQL, где использование limit уже является дорогостоящим запросом, и определение количества результатов также дорого. Таким образом, я бы не хотел делать еще один запрос, чтобы узнать количество результатов. Я не могу использовать MYSQL_CALC_FOUND_ROWS, потому что ограничение находится внутри подзапроса:
SELECT * FROM items,
(
SELECT
item_id
FROM
(etc)
WHERE
some.field=<parameter>
AND (etc)
GROUP BY (something)
ORDER BY (something_else) DESC
LIMIT 15
) subset
WHERE item.id=subset.item_id
Я мог бы оставить элементы соединения и отказаться от подзапроса, а затем иметь возможность использовать MYSQL_CALC_FOUND_ROWS, однако это очень, очень, медленно. Я перепробовал все оптимизации индекса, и давайте просто предположим, что об этом не может быть и речи.
Теперь это больше вопрос дизайна ... как разрешить пользователю просматривать эти данные, если я не знаю последнюю страницу? Я знаю только, зашли ли они слишком далеко (например: запрос не возвращает результатов).






Вот краткое изложение статьи гуру MySQL Барона Шварца:
http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/
По первому запросу извлеките и кешируйте все результаты.
Не показывать все результаты. Даже Google не позволяет увидеть миллионный результат.
Не показывать общее количество или промежуточные ссылки на другие страницы. Показывать только «следующую» ссылку.
Оцените, сколько есть результатов. Опять же, Google делает это, и никто не жалуется.
получение всех строк за раз будет ли это медленным процессом, если количество наборов данных очень велико
Чтобы усилить это, понятие «сколько» в любом случае чрезвычайно преходяще; к тому времени, когда ответ дойдет до пользователя, он легко может оказаться неправильным.
Очень хороший момент .. хотя в этом случае результаты вряд ли изменятся. Я решил вычислить «сколько» и кэшировать его (поскольку это кажется приятным тривиальным фрагментом данных), но не показывать результаты, прошедшие 500.
В ответ Биллу Карвину: у меня возник новый вопрос о том, возможно ли сохранение кешированных результатов в таблице MySQL, которая будет таблицей с 500000000 строк (500 результатов на элемент, 1000000 элементов). Его можно найти здесь.