Здравствуйте,
Дана таблица товаров (1 миллион) записей с join'ом еще на таблицу видимости этих товаров (5 млн) и свойства (еще 10 млн)
Есть gridview/listview с ActiveDataProvider на эту таблицу, который пытается при отображении запросить общее количество товаров, а этот запрос закономерно грузится до минуты времени.
Индексы в базе настроены неплохо и все нужные поисковые запросы работают достаточно быстро, вопрос в том что делать с пагинацией?
Есть ли пагинатор, который не запрашивает сразу число страниц? Т.е. 1,2,3,...10,...100,.... примерно 99999 товаров (уточнить)
Пагинация в Gridview при большом количестве данных
Re: Пагинация в Gridview при большом количестве данных
Если я правильно понял, нужно произвольно ставить цифру для количества отображения товаров на одной странице.
Значение для количества отображения данных на странице проставить можно в модели поиска у параметра pageSize
А каким образом реализовать решать уже вам
Значение для количества отображения данных на странице проставить можно в модели поиска у параметра pageSize
Код: Выделить всё
$dataProvider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 20,
],
]);
Re: Пагинация в Gridview при большом количестве данных
нет, вопрос не размере странички, а о проблеме глубже - пагинация всегда пытается запросить общее количество строк. Вопрос в том как избежать этого запроса
Re: Пагинация в Gridview при большом количестве данных
Пагинация подразумевает под собой разбитие миллиона строк из БД на страницы по какому-то количеству записей на страницу.
Соответственно, чтобы разбить на количество страниц, она должна выполнить метод getPageCount
В котором и идет расчет количества страниц.
Если не интересно разбитие на страницы, можно воспользоваться yii2-infinite-scroll бесконечной подгрузкой
Он вроде не использует общий запрос на 1 миллион, а выполняется запрос на лимит, а потом подгружается нужное количество.
- proctoleha
- Сообщения: 298
- Зарегистрирован: 2016.07.10, 19:00
Re: Пагинация в Gridview при большом количестве данных
Почему вы так уверены, что запрос COUNT(*) на несколько млн строк выполняется медленно? Что корень зла именно в этом?
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Re: Пагинация в Gridview при большом количестве данных
Собственно я и спросил, есть ли пагинатор, который не запрашивает сразу число страниц? Т.е. 1,2,3,...10,...100,.... примерно 99999 товаров (уточнить) =)
unknownby писал(а): ↑2020.11.20, 14:15 Пагинация подразумевает под собой разбитие миллиона строк из БД на страницы по какому-то количеству записей на страницу.
Соответственно, чтобы разбить на количество страниц, она должна выполнить метод getPageCount
В котором и идет расчет количества страниц.
Если не интересно разбитие на страницы, можно воспользоваться yii2-infinite-scroll бесконечной подгрузкой
Он вроде не использует общий запрос на 1 миллион, а выполняется запрос на лимит, а потом подгружается нужное количество.
Re: Пагинация в Gridview при большом количестве данных
в контексте сабжа - проблема именно в этом запросе, решается просто заданием $dataProvider->totalCount =1000000; но соответственно теряется пагинация.proctoleha писал(а): ↑2020.11.21, 06:49Почему вы так уверены, что запрос COUNT(*) на несколько млн строк выполняется медленно? Что корень зла именно в этом?
в контексте проблемы - count с условием ведет к тому, что база (в моем случае mysql) перебирает все подходящие под условия записи, чтобы их посчитать.
(например вот https://stackoverflow.com/questions/109 ... big-tables)
Re: Пагинация в Gridview при большом количестве данных
А что насчет бесконечной прокрутки? Без разбития на страницы