Здравствуйте, DiPaolo, Вы писали:
vsb>>Это удобней пользователю. Как раз постраничный вывод и нужен для уменьшения нагрузки на сервер. В идеальном мире с бесконечной производительностью ты всегда будешь получать полный список результатов поиска. Подгрузка результатов по мере скроллинга аппроксимирует этот идеальный мир.
DP>каким образом? что там, что там – одинаковые запросы на сервер и к базе. вот подробнее расписал http://rsdn.org/forum/web/8842263.1Автор: DiPaolo
Дата: 29.10 11:54
Есть два вида постраничного вывода.
Первый это запрос по конкретной странице, как было указано — с limit и offset. Проблема этого запроса в том, что он каждый раз отрабатывает заново. Я извлекаю 1 страницу — ну ок, 100 записей извлеки. Я запрашиваю 2 страницу, извлекли 200 записей, первые 100 пропустили, вторые 100 отдали. Я запрашиваю 1000 страницу, 100 000 записей извлекли, 99 900 пропустили, последние 100 отдали. Это квадратичный алгоритм. Он нормально работает, когда пользователю типично нужна первая, иногда вторая страница, но если пользователь часто скроллит далеко (а это реальный юзкейс во всяких инстаграммах, где юзеры могут скроллить часами), это неприменимо.
В принципе этот подход можно оптимизировать, если сильно нужно, добавить в базу поле "страница", пересчитывать его при удалении чего-то и тд. Это довольно муторно, но иногда нужно. Но когда условие может быть произвольным (к примеру результаты поиска сообщений конкретного пользователя, или вообще по произвольному условию), то этот подход оптимизировать нельзя никак.
Второй подход: сначала делаем запрос
id > 0 and {condition} order by id limit 100. Возвращаем результат. Для следующей страницы клиент передаёт максимальный id предыдущей страницы и мы делаем запрос
id > {prev_id} and {condition} order by id limit 100. Эти запросы уже всегда отрабатывают эффективно (конечно при условии наличия индексов). Минус этого подхода в том, что невозможно перейти с первой страницы на сотую. Т.е. сделать интерфейс с номерами страниц, как на типичном форуме, будет затруднительно. Можно только с текущей страницы перейди на первую, последнюю, предыдущую и следующую. Но если мы реализуем подгрузку результатов по мере скроллинга, то нам как раз и не нужно переходить на произвольную страницу, как раз именно переход на следующую страницу (или на предыдущую или возврат на последнюю) это типичный юз-кейс.
Вроде я это имел в виду.