Как определить «количество страниц» наиболее эффективно? - PullRequest
3 голосов
/ 17 марта 2009

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

Проблема возникает почти в каждом веб-проекте: у вас есть таблица с множеством записей, и вы хотите, чтобы они отображались на отдельных страницах.

Теперь мне интересно, как лучше всего рассчитать количество страниц, необходимое для определенного набора строк таблицы.

Вот некоторые подходы, о которых я думал. Я хотел бы получить ответ о том, насколько они эффективны. Я приведу примеры, специфичные для PHP, но могу поспорить, что на других языках есть похожие методы.

  1. Вероятно, лучший способ - это статическое сохранение количества страниц и изменение значения при каждом добавлении новой записи. (Тем не менее ... Я ищу динамическое решение :-))

  2. Сделайте SELECT COUNT(*) над интересующими строками и вычисляйте номер страницы каждый раз, когда страница отображается.

  3. Сделайте обычный выбор, чтобы получить набор результатов для всех строк. Теперь не загружайте строки, вызывая mysql_fetch_row или около того, но получите количество строк с помощью mysql_num_rows. (Поскольку я понятия не имею, как это реализовано, я не могу сказать, является ли это эффективным или нет. Кто-нибудь, кто знает?) Тогда я мог бы удобно перемещать указатель набора результатов. (Для mysqli существует mysql_data_seek, но собственное расширение MySQL не имеет аналогичной функции. Поэтому я предполагаю, что это всего лишь некоторое поведение буферизации mysqli)

Кто-нибудь может сказать, как наиболее эффективно посчитать количество строк (количество страниц)?

Ответы [ 8 ]

9 голосов
/ 17 марта 2009

Номер 2 является наиболее распространенным шаблоном

select count(*) from [Table] where [Expressions]

А потом

select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize]

Это дает вам общее количество строк для всего набора результатов, но только данные строк для текущей страницы.

Многие фреймворки или CMS имеют соглашения для кэширования определенных частей этих данных в сеансе, которые вы можете или не хотите делать в зависимости от ожидаемых размеров таблиц, изменчивости данных и т. Д.

3 голосов
/ 17 марта 2009

Если вы действительно хотите получить что-то с истинно WTF-пропорциями, вы всегда можете отследить, сколько строк было, увеличивая некоторый регистр с помощью триггера на вставку / удаление.

Но я думаю, что это ответ, требующий еще больше вопросов;).

Просто используйте SELECT COUNT, если нужно. Если он медленный, это означает, что ваша база данных обычно создается неправильно.

Кроме того, у меня такое чувство, что здесь происходит преждевременная оптимизация. Не оптимизируйте преждевременно. Сделайте так, чтобы это имело смысл, а затем сделайте это лучше. Есть смысл?

0 голосов
/ 23 сентября 2009

Хороший способ сделать это - использовать SQL_CALC_FOUND_ROWS

Пример:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

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

Важно отметить, что FOUND_ROWS() не надежен при использовании репликации базы данных MySQL

0 голосов
/ 24 марта 2009

Возможно, вы захотите проверить этот вопрос, он очень похож на тот, который вы задаете.

0 голосов
/ 17 марта 2009

На самом деле, если вы заполняете страницу PHP

for($i=0;$i<count($arrayvar);$i++){}

Даже с помощью простого механизма шаблонов вы можете объявить блок внутри другого блока и проанализировать все данные в одной последовательной строке.

Надеюсь, это тот тип ответа, который вы ищете. Мне не совсем понятно, что вы подразумеваете под своим вопросом, но я думаю, что это так.

0 голосов
/ 17 марта 2009

2 вопроса для рассмотрения в этом контексте:

  • как обращаться с данными, которые обновляются / вставляются во время просмотра?
  • сколько одновременных пользователей будут просматривать данные, и сможет ли приложение не отставать от трафика, когда оно динамически выбирает страницы данных?

В зависимости от ответов, некоторые другие ответы здесь могут или не могут применяться.

0 голосов
/ 17 марта 2009

Я думаю, что вы хотите построить навигацию вокруг одного SQL-запроса, который изменяет только ключевое слово LIMIT. Например, SELECT * FROM myTable LIMIT 0,20 вернет первые 20 строк. В вашем PHP-сценарии для страницы 2 вы затем установите для SQL-запроса значение SELECT * FROM myTable LIMIT 20,40, возвращая таким образом строки от 20 до 40. Это то, что вы искали?

Навигация может быть построена с помощью вашего PHP-скрипта, просто выбрав COUNT (*) / rowPerPage и, таким образом, зацикливая структуру кода до тех пор, пока не встретится общее количество строк. Конечный запрос будет тогда LIMIT to lastLimit, TotalRowCount.

Редактировать: чтобы вычислить, сколько страниц вам нужно, чтобы вычислить все строки, вам нужно определить, сколько строк может иметь 1 страница. Затем вы должны выполнить TotalRows / MaxPerPage = howManyPagesNeeded

0 голосов
/ 17 марта 2009

Если я правильно понимаю, в большинстве систем, над которыми я работал, мне нужно было количество страниц одновременно, когда я собираю новый набор строк для страницы. Это позволяет отображать «страницу N of M» или что-то подобное в качестве заголовка и экран, полный записей.

Это зависит от базы данных, но обычно вы передаете номер current_page (или номер строки), а затем делаете «ограниченный запрос» (fetchsize, top и т. Д.), Чтобы получить следующий набор строк и общее количество страниц. Конечно, становится некрасиво, если под ним меняется количество строк, но я обычно не беспокоюсь об этом.

Paul.

...