Разбивка очень больших наборов данных - PullRequest
3 голосов
/ 07 декабря 2008

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

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

Ответы [ 2 ]

6 голосов
/ 07 декабря 2008

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

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

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

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

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

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

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

0 голосов
/ 07 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...