Какой самый эффективный способ разбить мой сайт на страницы при запросах с помощью SQL? - PullRequest
0 голосов
/ 09 сентября 2008

Я пытаюсь разбить на страницы результаты SQL-запроса для использования на веб-странице. Язык и база данных: PHP и SQLite.

Код, который я использую, работает примерно так (нумерация страниц начинается с 0)

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

Есть ли более эффективные способы разбиения на страницы, чем этот?

Одна проблема, которую я вижу в моем текущем методе, заключается в том, что я должен сохранить все 10 (или сколько угодно) результатов в памяти, прежде чем я начну их отображать. Я делаю это, потому что PDO не гарантирует, что количество строк будет доступно.

Эффективнее ли выполнить запрос COUNT(*), чтобы узнать, сколько строк существует, а затем передать результаты в браузер?

Является ли это одним из тех «это зависит от размера вашей таблицы, и требует ли запрос count(*) полного сканирования таблицы в бэкэнде базы данных», «выполнить некоторые профилирующие вопросы»?

Ответы [ 4 ]

2 голосов
/ 15 сентября 2008

Есть несколько случаев, когда у меня есть довольно сложный (9-12 объединение таблиц) запрос, возвращающий многие тысячи строк, которые мне нужно разбить на страницы. Очевидно, чтобы хорошо разбить на страницы, вам нужно знать общий размер результата. С базами данных MySQL, использование директивы SQL_CALC_FOUND_ROWS в SELECT может помочь вам легко достичь этого, хотя жюри покажет, будет ли это более эффективным для вас.

Однако, поскольку вы используете SQLite, я рекомендую придерживаться подхода с двумя запросами. Здесь - очень лаконичная тема по этому вопросу.

2 голосов
/ 10 сентября 2008

Я решил использовать метод двух запросов COUNT (*), потому что он позволяет мне создать ссылку непосредственно на последнюю страницу, что не разрешено другим методом. Выполнение подсчета в первую очередь также позволяет мне передавать результаты, поэтому должно хорошо работать с большим количеством записей и меньшим объемом памяти.

Согласованность страниц не является для меня проблемой. Спасибо за вашу помощь.

1 голос
/ 09 сентября 2008

Я сомневаюсь, что для ваших пользователей будет проблемой дождаться, пока бэкэнд вернет десять строк. (Вы можете сделать это, указав размеры изображения, заставить веб-сервер согласовывать передачу сжатых данных, когда это возможно, и т. Д.)

Я не думаю, что для вас будет очень полезно изначально считать (*).

Если у вас сложное кодирование: когда пользователь смотрит на страницу x, используйте ajax-подобную магию, чтобы предварительно загрузить страницу x + 1 для улучшения взаимодействия с пользователем.

Общее примечание о нумерации страниц: Если данные изменяются в то время, когда пользователь просматривает ваши страницы, может быть проблемой, если ваше решение требует очень высокого уровня согласованности. Я написал записку об этом в другом месте .

1 голос
/ 09 сентября 2008

Я бы посоветовал сначала сделать подсчет. count (первичный ключ) - очень эффективный запрос.

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