Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
bestazzz
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
1

Постраничная навигация

07.02.2016, 19:23. Просмотров 449. Ответов 5
Метки нет (Все метки)

Вечер добрый. В общем тема то изъезженная.
Мой вопрос касается постраничной навигации при большом количестве записей в mysql.

В таблице присутствует более 300 000 записей.
Так как я использую уже готовую CMS, изначально запрос к бд на вывод записей был такой:

SQL
1
SELECT * FROM table_post ORDER BY id DESC LIMIT 0,20;
При навигации по первым страницам, запрос обрабатывается очень быстро. С увлечением LIMIT начинаются жесткие задержки.

Далее на хабре нашел костыль, переписал запрос и получилось:
SQL
1
SELECT * FROM table_post JOIN (SELECT id FROM table_post ORDER BY id DESC LIMIT 0,20) AS b ON b.id = table_post.id
Запрос обрабатывается очень быстро и не важно, на какой странице находишься. Но если в него добавить условие WHERE, обработка уже идет чуть дольше, но всё равно на порядок лучше первого.

Затем на той же хабре увидел второй костыль:
SQL
1
SELECT * FROM table_post WHERE id<300000 ORDER BY id DESC  LIMIT 20;
Этот запрос понравился больше всего, обрабатывается молниеносно. Но не могу сделать постраничную навигацию.

А теперь сам вопрос. Сайт у меня идет по такому типу: Главная, категории и новости.
Последний запрос мне удалось сделать на главной странице. Так как на главной выводятся все записи и ID идет по порядку, и без пропуска, записи сортируются по ID по убыванию. Достаточно было уменьшать WHERE id<300000 на -20 если переходишь на следующую страницу или на +20 если переходишь на предыдущую страницу.

А вот с категориями возникли проблемы, так как если делать выборку по категориям, id идет с большими пропусками, например 1488, 1089, 999. В итоге постраничную навигацию вперед-назад для категорий, я сумел сделать только вперед. То есть, делаю так. Самая первая страница категории:
SQL
1
SELECT * FROM table_post WHERE id<запись_с_максимальным_ид AND category=10 ORDER BY id DESC LIMIT 20;
Если перейти на следующую страницу, через url передаю id последней записи из первой выборки и уже с неё начинается выборка для следующей страницы.

А вот как организовать переход на предыдущую страницу, ума вообще не приложу.

У кого нибудь есть варианты, как прикрутить последний запрос к странице с категориями?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2016, 19:23
Ответы с готовыми решениями:

постраничная навигация
Вот страница которая выводится... жирным шрифтом показана постраничная...

Постраничная навигация
В общем есть таблица options где хранится число &quot;5&quot; для вывода 5 записей на...

Постраничная навигация
Привет, мир! Знатоки SQL + PHP, подскажите принцип работы постраничной...

постраничная навигация
&lt;? сдесь вместо стрелок я вставил ссылки на картинки ...

Постраничная навигация
Нужно по нажатию на кнопку вывести песни определенного жанра. При нажатии на...

5
miketomlin
Заблокирован
07.02.2016, 19:44 2
Зачем было увеличивать лимит? Базу не пробовали менять?

Добавлено через 3 минуты
Уверен, что туеву хучу новостей можно в архив отправить...
0
bestazzz
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
07.02.2016, 20:00  [ТС] 3
Цитата Сообщение от miketomlin Посмотреть сообщение
Зачем было увеличивать лимит? Базу не пробовали менять?

Добавлено через 3 минуты
Уверен, что туеву хучу новостей можно в архив отправить...
Извиняюсь, не правильно выразился, не limit, а offset.
0
miketomlin
Заблокирован
07.02.2016, 22:54 4
Добавьте условие `id`>..., отделив грубо говоря новые новости от старых, и дальше делайте все, как обычно, т.е. через базу (offset).

Можно и не добавлять условие, а просто вынести архивные новости в отдельную таблицу или таблицы.
1
bestazzz
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 41
08.02.2016, 09:41  [ТС] 5
Цитата Сообщение от miketomlin Посмотреть сообщение
Добавьте условие `id`>..., отделив грубо говоря новые новости от старых, и дальше делайте все, как обычно, т.е. через базу (offset).

Можно и не добавлять условие, а просто вынести архивные новости в отдельную таблицу или таблицы.
Первый вариант не подходит, так как нужно чтобы все новости были доступны при навигации.

Второй вариант затестил, удалив 200к записей из таблицы. Скорость выполнения упала с 0.1000 до 0.0300
Теперь думаю разбивать таблицу с новостями по 100к записей, это получается у меня будет 4 таблицы с новостями.

Не подскажите, как лучше будет организовать такую идею? Больше интересует, как правильнее сделать постраничную навигацию в категориях. То есть, перейдя на следующую страницу в навигации, как дать понять скрипту, что уже нужно брать записи из другой таблицы с новостями?
0
miketomlin
Заблокирован
08.02.2016, 10:56 6
В общем реализуется просто, но у вас же CMS, поэтому не знаю. Поищите возможность помещать статьи в архив. Т.е. грубо говоря у вас должно получится что-то такое:
Новости - основная таблица новостей;
Архив 2014 - таблица новостей за 2014 год;
Архив 2013 - таблица новостей за 2013 год;
и т.п.

Цитата Сообщение от bestazzz Посмотреть сообщение
Теперь думаю разбивать таблицу с новостями по 100к записей, это получается у меня будет 4 таблицы с новостями.
Да, только сразу по достижении предела 100к разделять не нужно. Пусть в основной таблице наберется к примеру 150к новостей, тогда 100к уберете в архив, а 50к оставите, пока снова не наберется 150к.

Добавлено через 2 минуты
Можете поштучно списывать в архив. Добавилась очередная статья и при этом последняя автоматом списалась в активный архив.

Добавлено через 21 минуту
В принципе первый вариант раньше времени также отбрасывать не стоит. Вы можете архивы за разные периоды выбирайте из основной таблицы при помощи условия BETWEEN a AND b.
1
08.02.2016, 10:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2016, 10:56

Постраничная навигация
Всем доброго времени суток! Нужна помощь или совет в реализации постраничной...

постраничная навигация
Всем привет, кто знает как грамотно записать запрос постраничной навигации...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru