Пагинация в Gridview при большом количестве данных

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yujin1st
Сообщения: 192
Зарегистрирован: 2012.03.26, 12:03

Пагинация в Gridview при большом количестве данных

Сообщение yujin1st »

Здравствуйте,
Дана таблица товаров (1 миллион) записей с join'ом еще на таблицу видимости этих товаров (5 млн) и свойства (еще 10 млн)
Есть gridview/listview с ActiveDataProvider на эту таблицу, который пытается при отображении запросить общее количество товаров, а этот запрос закономерно грузится до минуты времени.
Индексы в базе настроены неплохо и все нужные поисковые запросы работают достаточно быстро, вопрос в том что делать с пагинацией?
Есть ли пагинатор, который не запрашивает сразу число страниц? Т.е. 1,2,3,...10,...100,.... примерно 99999 товаров (уточнить)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Пагинация в Gridview при большом количестве данных

Сообщение unknownby »

Если я правильно понял, нужно произвольно ставить цифру для количества отображения товаров на одной странице.
Значение для количества отображения данных на странице проставить можно в модели поиска у параметра pageSize

Код: Выделить всё

$dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 20,
            ],
        ]);
А каким образом реализовать решать уже вам :)
yujin1st
Сообщения: 192
Зарегистрирован: 2012.03.26, 12:03

Re: Пагинация в Gridview при большом количестве данных

Сообщение yujin1st »

нет, вопрос не размере странички, а о проблеме глубже - пагинация всегда пытается запросить общее количество строк. Вопрос в том как избежать этого запроса
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Пагинация в Gridview при большом количестве данных

Сообщение unknownby »

yujin1st писал(а): 2020.11.20, 13:55 нет, вопрос не размере странички, а о проблеме глубже - пагинация всегда пытается запросить общее количество строк. Вопрос в том как избежать этого запроса
Пагинация подразумевает под собой разбитие миллиона строк из БД на страницы по какому-то количеству записей на страницу.
Соответственно, чтобы разбить на количество страниц, она должна выполнить метод getPageCount
В котором и идет расчет количества страниц.
Если не интересно разбитие на страницы, можно воспользоваться yii2-infinite-scroll бесконечной подгрузкой :D
Он вроде не использует общий запрос на 1 миллион, а выполняется запрос на лимит, а потом подгружается нужное количество.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Пагинация в Gridview при большом количестве данных

Сообщение proctoleha »

yujin1st писал(а): 2020.11.20, 13:55 нет, вопрос не размере странички, а о проблеме глубже - пагинация всегда пытается запросить общее количество строк. Вопрос в том как избежать этого запроса
Почему вы так уверены, что запрос COUNT(*) на несколько млн строк выполняется медленно? Что корень зла именно в этом?
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
yujin1st
Сообщения: 192
Зарегистрирован: 2012.03.26, 12:03

Re: Пагинация в Gridview при большом количестве данных

Сообщение yujin1st »

Собственно я и спросил, есть ли пагинатор, который не запрашивает сразу число страниц? Т.е. 1,2,3,...10,...100,.... примерно 99999 товаров (уточнить) =)

unknownby писал(а): 2020.11.20, 14:15 Пагинация подразумевает под собой разбитие миллиона строк из БД на страницы по какому-то количеству записей на страницу.
Соответственно, чтобы разбить на количество страниц, она должна выполнить метод getPageCount
В котором и идет расчет количества страниц.
Если не интересно разбитие на страницы, можно воспользоваться yii2-infinite-scroll бесконечной подгрузкой :D
Он вроде не использует общий запрос на 1 миллион, а выполняется запрос на лимит, а потом подгружается нужное количество.
yujin1st
Сообщения: 192
Зарегистрирован: 2012.03.26, 12:03

Re: Пагинация в Gridview при большом количестве данных

Сообщение yujin1st »

proctoleha писал(а): 2020.11.21, 06:49
yujin1st писал(а): 2020.11.20, 13:55 нет, вопрос не размере странички, а о проблеме глубже - пагинация всегда пытается запросить общее количество строк. Вопрос в том как избежать этого запроса
Почему вы так уверены, что запрос COUNT(*) на несколько млн строк выполняется медленно? Что корень зла именно в этом?
в контексте сабжа - проблема именно в этом запросе, решается просто заданием $dataProvider->totalCount =1000000; но соответственно теряется пагинация.
в контексте проблемы - count с условием ведет к тому, что база (в моем случае mysql) перебирает все подходящие под условия записи, чтобы их посчитать.
(например вот https://stackoverflow.com/questions/109 ... big-tables)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Пагинация в Gridview при большом количестве данных

Сообщение unknownby »

yujin1st писал(а): 2020.11.21, 20:11 в контексте сабжа - проблема именно в этом запросе
А что насчет бесконечной прокрутки? Без разбития на страницы
Ответить