Пагинация очень больших наборов данных

У меня есть набор данных в 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, однако это очень, очень, медленно. Я перепробовал все оптимизации индекса, и давайте просто предположим, что об этом не может быть и речи.

Теперь это больше вопрос дизайна ... как разрешить пользователю просматривать эти данные, если я не знаю последнюю страницу? Я знаю только, зашли ли они слишком далеко (например: запрос не возвращает результатов).

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
0
2 606
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот краткое изложение статьи гуру MySQL Барона Шварца:

http://www.mysqlperformanceblog.com/2008/09/24/four-ways-to-optimize-paginated-displays/

Четыре способа оптимизации дисплеев с разбивкой на страницы

  1. По первому запросу извлеките и кешируйте все результаты.

  2. Не показывать все результаты. Даже Google не позволяет увидеть миллионный результат.

  3. Не показывать общее количество или промежуточные ссылки на другие страницы. Показывать только «следующую» ссылку.

  4. Оцените, сколько есть результатов. Опять же, Google делает это, и никто не жалуется.

В ответ Биллу Карвину: у меня возник новый вопрос о том, возможно ли сохранение кешированных результатов в таблице MySQL, которая будет таблицей с 500000000 строк (500 результатов на элемент, 1000000 элементов). Его можно найти здесь.

Sam 07.12.2008 09:46

получение всех строк за раз будет ли это медленным процессом, если количество наборов данных очень велико

ashwintastic 31.01.2020 16:10

Чтобы усилить это, понятие «сколько» в любом случае чрезвычайно преходяще; к тому времени, когда ответ дойдет до пользователя, он легко может оказаться неправильным.

Очень хороший момент .. хотя в этом случае результаты вряд ли изменятся. Я решил вычислить «сколько» и кэшировать его (поскольку это кажется приятным тривиальным фрагментом данных), но не показывать результаты, прошедшие 500.

Sam 07.12.2008 09:53

Другие вопросы по теме