[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пагинация
Страницы: 1, 2
paul85
Здравствуйте!

Каким образом можно реализовать пагинацию больших таблиц (свыше 100к записей) без потери производительности?

Запрос типа LIMIT 50000, 100 уже начинает подтормаживать. В интернете нашел решение, когда вместо номера страницы передается ID следующей записи и тогда запрос выглядит примерно так:
SELECT * FROM tale WHERE table_id>n LIMIT 100

Работает, кстати, очень хорошо! Но есть проблема: как отображать номера страниц? ID, понятное дело, PK AI. И всё бы отлично, но в нем существуют "дыры" от удаленных записей. Вот если бы их не было, посчитать номера страниц не представляло бы никакой сложности, путем элементарных арифметических действий.

Предлагаемые способы решения проблемы нашел такие:
1. "бесконечная страница" - а-ля фейсбук или контакт. Когда по мере прокрутки подгружается контент вниз страницы.
2. Не отображать номера страниц вообще, а сделать только кнопки: влево, вправо, первая, последняя. Технически самый простой и грамотный способ. Но вызывает большой вопрос в юзабилити.
3. Сообщить пользователю, что найдено 1389 страниц, но показывать не более 40-ка.

Проблема! Поисковики. То есть фактически для поисковых машин подходит только второй способ. Собственно говоря нет задачи отображать клиенту 100500 страниц. Все-равно ни один человек в здравом уме не пойдет дальше 20-30 страниц, даже самый упоротый упорный.

Короче, как по-человечески сделать? =))) Предлагаю открыть дискуссию, тем более были неоднократные призывы. ;)
pamparam
а как сделать пагинацию маленьких таблиц знаете?
Игорь_Vasinsky
paul85
не слыхал про сегментирование таблиц ?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
paul85
pamparam, на маленьких таблицах я делаю вот так:
http://www.wisereport.ru/php-%D1%80%D0%B0%...B8%D1%86%D1%8B/

Очень удобно и хорошо работает. Но это, когда количество записей, скажем, до 10к. А дальше уже я бы не рекомендовал пользоваться таким способом.

Цитата (Игорь_Vasinsky @ 8.01.2015 - 23:31)
не слыхал про сегментирование таблиц ?

Игорь, слыхал, но как применить к пагинации слабо представляю. Это же имеется ввиду partitioning? Никогда с ним не работал. Буду признателен за разъяснение идеи.
Игорь_Vasinsky
paul85
ну вот пример разбирали для мускула

http://www.sql.ru/forum/1003590/segmentiro...tablicy-po-date


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
sergeiss
Цитата (paul85 @ 8.01.2015 - 22:34)
В интернете нашел решение, когда вместо номера страницы передается ID следующей записи и тогда запрос выглядит примерно так:

Это решение, действительно, достаточно хорошее. При условии, что юзер последовательно идет по страницам smile.gif Но обычно, когда есть кнопки "вперед", "назад", "на самую первую", "на самую последнюю", то там же делается и переход на определенную страницу. При указанном подходе можно только примерно перейти на произвольную страницу, "плюс-минус лапоть".

Цитата (paul85 @ 8.01.2015 - 22:34)
1. "бесконечная страница" - а-ля фейсбук или контакт. Когда по мере прокрутки подгружается контент вниз страницы.

Тоже хороший вариант. Только лучше не "по мере прокрутки", а добавить внизу кнопку для загрузки. Типа того, что "Показать еще" или как-то по-другому назвать, в зависимости от содержания контента.
Меня вот, как пользователя, просто бесит, когда крутишь вниз, а страница не кончается.
А с кнопкой в конце - оно как раз "юзер френдли" получается. Потому что юзеру дается возможность самому управлять процессом, а не так, что "за него решают". Если этот способ объединить с четкой сортировкой, которой юзер также может управлять, то получится вполне себе хорошая "конфетка" smile.gif

Например, зайди вот сюда: http://skidkavo.com Сайт изначально я делал. Правда, его уже потом очень сильно дополнили, но общая основа осталась. Там как раз так сделано, как в "варианте 1", причем с кнопкой внизу (кнопка называется "Больше интересных предложений" - это было пожелание заказчика). Если будешь кнопать, то выбирай города Дальнего Востока (Хабаровск, Владивосток...), потому что сайт изначально на тот регион расчитан.

Цитата (paul85 @ 8.01.2015 - 22:34)
2. Не отображать номера страниц вообще, а сделать только кнопки: влево, вправо, первая, последняя. Технически самый простой и грамотный способ. Но вызывает большой вопрос в юзабилити.

Это тот же способ, что ты описал в самом начале. С единственным недостатком, о котором я уже сказал.

Цитата (paul85 @ 8.01.2015 - 22:34)
3. Сообщить пользователю, что найдено 1389 страниц, но показывать не более 40-ка.

Можно и так smile.gif Кто же их будет считать-то? smile.gif Способы 2 и 3 можно объединить.


Цитата (Игорь_Vasinsky @ 9.01.2015 - 02:13)
ну вот пример разбирали для мускула

Игорь, а при чем тут партицирование таблиц??? Оно Павлу в данном случае никак не поможет. У него потому что задача пагинации стоит, при отдаче данных.

PS. И да, забыл добавить (хотя, может, это и очевидно). Вот это "вместо номера страницы передается ID следующей записи" также очень хорошо используется в "варианте 1". Вместе с фильтрами и сортировками, которыми пользователь может управлять сам.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.