Оптимизация категоризированного поиска товаров.

S
На сайте с 18.04.2015
Offline
7
429

Добрый день.

Столкнулся с проблемой скорости загрузки страниц на каталогах подарков http://begift.ru/ и http://begift.com.ua/ На сайте каждый товар имеет ряд параметров, которые его характеризуют. Параметры, в свою очередь, разбиты по категориям. Например, товар: цветы имеют параметры «Праздник» – 8 Марта, 14 Февраля… и «Кому подарить»: Маме, Жене, Девушке и т.д. Пользователь может свободно комбинировать параметры, на основе которых ему показываются подходящие товары. Пытаюсь оптимизировать данную страницу, поскольку время генерации составляет неприличные 10-15 сек: http://tools.pingdom.com/fpt/#!/cmMCQJ/http://begift.com.ua/chto-podarit-na-novyj-god-iz-igrushek/

Подбор товара осуществляется алгоритмом: параметры внутри категории объединяются оператором ИЛИ, сами категории – оператором И. Страница, кроме основного списка, показывает также количество подарков, которое будет получено путем комбинирования уже выбранных и дополнительных параметров. Этот расчет также происходит по тому же алгоритму. Таким образом, мы имеем около 30 таких выборок на каждую загрузку страницы. В большинстве случаев используем подготовленные запросы, но для таких страниц запрос полностью генерируется в php коде вместе с параметрами. Он довольно объемный и плохо оптимизируется с самой базой. Я уже реализовал кэширование (сохраняя результаты всех вычислений для каждой страницы) на стороне сервера. Так как стоимость товара и его наличие обновляется, то этот кэш нужно обновлять раз в 1-2 дня. Страниц около 3000, если кэшировать каждую каждый день, то только на кэширование уйдет 10 часов.

Хочу провести сравнительные тесты разных альтернативных алгоритмов. Возможно, у кого-то есть опыт в таких задачах. Буду благодарен за совет.

totamon
На сайте с 12.05.2007
Offline
437
#1

мы догадаться должны как у вас данные хранятся, какими запросами получаются? какие советы вы ждете? альтернативный алгоритм один - правильная БД с индексами, и правильный код...

Sheehave:
мы имеем около 30 таких выборок на каждую загрузку страницы.

умеючи можно и по 300 запросов на страницу накодить...

зы. на первый взгляд как-то сложно все, вам сначала в "Юзабилити" стоит проконсультироваться)) главный вопрос - зачем в меню слева вы цифры пересчитываете? ничего не понятно из-за этого... в меню Мужу(363), выбираю, на странице уже - Что подарить мужу (Всего отобрано идей подарков: 163) куда еще 200 делись? и как быть если я хочу выбрать подарок жене, любимой и девушке одновременно?

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
S
На сайте с 18.04.2015
Offline
7
#2
totamon:
мы догадаться должны как у вас данные хранятся, какими запросами получаются?

Ок, кода много, но попытаюсь расписать общую схему:

Структура базы вида:

products

id, ...

properties
id,categoty_id, title

products_properties
property_id,categoty_id, product_id

Пример запроса:

На входе имеем поиск по набору параметров 1,2,3,4,5,6

Параметры разбиты по категориям вроде:

1: {1,4},

2: {2,3,6},

3: {5}

php-код генерит запрос вида :

    SELECT p.*

FROM products p
WHERE 1=1
AND EXISTS (SELECT 1 FROM products_properties ppts WHERE p.id = ppts.product_id AND ppts.property_id IN (1,4) )
AND EXISTS (SELECT 1 FROM products_properties ppts WHERE p.id = ppts.product_id AND ppts.property_id IN (2,3,6) )
AND EXISTS (SELECT 1 FROM products_properties ppts WHERE p.id = ppts.product_id AND ppts.property_id IN (5) )
totamon:

какие советы вы ждете?

Возможно, кто-то уже решал подобную проблему и сможет предложить оптимизацию.

Пока люди подсказали как оптимизировать саму базовую выборку менее ресурсоёмкими для mysql запросами - через джойны и групповыми функциями с хевингами. Но всё равно каждый из таких запросов надо генерировать из php согласно разбитию на категории, а потому весь список слева одним запросом не получить.

totamon:

зы. на первый взгляд как-то сложно все, вам сначала в "Юзабилити" стоит проконсультироваться)) главный вопрос - зачем в меню слева вы цифры пересчитываете? ничего не понятно из-за этого... в меню Мужу(363), выбираю, на странице уже - Что подарить мужу (Всего отобрано идей подарков: 163) куда еще 200 делись?

Это замечание уже высказывали, действительно немного непонятно - подарки группируются по возможности в идеи, а потому идей 163, а всего подарков 363. Вот этой надписи про "всего подарков" и не хватает.

Сами цифры показывают как добавление фильтра отразится на результатах поиска.

totamon:

и как быть если я хочу выбрать подарок жене, любимой и девушке одновременно?

Раньше можно было :) Но наш СЕО-специалист просил сократить количество страниц, потому мы отсеяли часть комбинаций, которые не столь информативны.

Но юзабилити это уже действительно вопрос для другой ветки форума)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий