Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: подсчет с группировкой и сохранение/кеширование результата
Форумы портала PHP.SU » » Объектно-ориентированное программирование » подсчет с группировкой и сохранение/кеширование результата

Страниц (1): [1]
 

1. broshurkaplus - 12 Августа, 2015 - 21:12:41 - перейти к сообщению
есть таблица с товарами/объявлениями.
основные параметры - покупка/продажа/обмен/бесплатно
таблицы с товарами от 1 до 10 миллионов записей, записи постоянно удаляются/добавляются, обновляется время у старых записей.
выборка с join по нескольким таблицам:

для формирования страницы выбираем строки у которых время свежее.
(дополнительно могут быть в разрезе разделов/категорий, по городам/регионам, новые/бу и тд.)

класс имеет конструктор, который изначально считает:

1) count с группировкой по покупка/продажа/обмен/бесплатно.
проблема - после 500к строк начинает тормозить, тяжелый
ВОПРОС 1
что предпринять чтоб постоянно не выполнять count ?

2) count с группировкой по подкатегориям текущего раздела (4ступени вложенности).
ВОПРОС 2 проблема и вопрос тотже?

3)
проблема - сложность построения пагинаторв для больших данных, те выборки данных на страницу далеко за первую - пока решена ограничением страниц в 500 и предложением пользователю уточнить параметры.
ВОПРОС 3 как улучшить?

прошу подсказать подходящее решение или направить, как пример - там всегда сумма по подкатегориям : olx (сумма частные/бизнес), avito

пока вижу так:
создать таблицу и складывать ключ/значение в нее
перед запросом проверять эту таблицу и время вставки, если прошло до 10 минут - отдавать пользователю сэти данные, иначе - новый тяжелый запрос

спасибо.
2. Мелкий - 12 Августа, 2015 - 21:17:24 - перейти к сообщению
Да, отдельная таблица с аггрегированными данными.
Всегда отдавать данные из этой таблицы, обновлять фоновой задачей (кроном, как самое простое)
3. broshurkaplus - 12 Августа, 2015 - 22:28:35 - перейти к сообщению
тк разнообразных запросов очень и очень много я больше склоняюсь к заполнению таблицы из класса, а потом можно порциями кроном обновлять. тока не пойму в таблицу ложить хэш запроса, сам запрос...

может подробней изложите свое видение?
4. Мелкий - 12 Августа, 2015 - 22:49:07 - перейти к сообщению
Это не моё видение, это общий подход. count делать дорого. Аггрегацию ещё дороже. Раз данных довольно много - значит надо сделать меньше данных.
Может быть несколько агрегатов надо сделать.
5. broshurkaplus - 02 Сентября, 2015 - 12:14:54 - перейти к сообщению
попробовал - пришел к выводу, что в таблице хранить напряжно, тк выборка может иметь комбинацию до 10 фильтров, + все это * на 1000 городов * 1000 рубрик - очень много. да и если основная таблица обновляется постоянно, то дергать обновлениями громадную таблицу не хорошо.
пока реализовал так - закрутил мемкеш и скидываю результаты тяжелых запросов с count туда на некоторое время.
однако тут пришлось пожертвовать точностью данных - тк основная таблица постоянно обновляется - точность результата выборок задерживается на время хранения в кеше, но хотя бы снижается количество запросов к базе...

подскажите - чем может быть чревато использование такого варианта?
- что попробовать/использовать/почитат ь еще?

 

Powered by ExBB FM 1.0 RC1