[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация при организации фильтра по товарам
Страницы: 1, 2
barkar@mail.ru
Добрый день уважаемые форумчане!
Сделал фильтр по товарам (цена, свойства, материалы, технологии и т.п.).
Реализация такова:
1. Выбираем с базы список фильтров присущих этому каталогу
2. Выбираю с базы все товары согласно выбранному каталогу
3. Через цикл происходит вывод (выводятся не все товары, благодаря постраничной навигации) непосредственно товаров и здесь же идет сравнение по фильтру на соответствие товара тем или иным свойствам.

Все прекрасно работает тестировал. НО проблема такова что если товаров более 5000 в этой категории то обработка идет около 3-5 сек на локальном сервере DENWER.

Может есть другие способы организации фильтров по товарам.


Почему таким образом пошел, минимум запросов к базе вся обработка идет после выборки.

Спасибо за внимание извините если где и ошибся в терминологии, учусь!
sergeiss
Цитата (barkar@mail.ru @ 30.05.2014 - 11:07)
Реализация такова:...

Такой реализацией ты извратил саму суть запросов и вообще СУБД. Твои действия напоминают примерно такие:
1. Выкладываем из шкафа все вещи.
2. Выбираем все вещи с определенной полки, согласно определенным критериям.
3. Перебираем все вещи по одной, оценивая цвет, фактуру, размер...

...в итоге достаем носки, ради которых все и было затеяно smile.gif

Как ты думаешь, имеет смысл вынимать все вещи из шкафа ради пары носков? Или лучше просто залезть на ту полку, где они лежат, и взять?

Это я к тому, что тебе надо изучить, что такое вообще БД, как делаются запросы. В частности (очень понадобится), что такое JOIN и как работает. А заодно WHERE - ограничения (фильтры) на выборку. Также LIMIT пригодится...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
barkar@mail.ru
Да не совсем все так.
Выбираются например термобелье которое можно фильтровать по разным типам свойствам используемым технологиям и т.п.
Возможен и такой вариант делается выборка с БД согласно постраничной навигации это 1 запрос (от 10 до 100 товаров) и потом самое прикольное от 40 > запросов к БД чтобы проставить количество товаров по каждому фильтру.
Как рациональней будет поступить.
Для наглядности вот пример на основе которого я делал свой фильтр
kaww
barkar@mail.ru, почему > 40 запросов? Допустим, что вся информация о товаре хранится в одной таблице, тогда Получить товары по параметрам (фильтр):
select * from products where attribute_1 = 'value1' and attribute_2 > 'value2' limit 50, 10

Или какая-нибудь EAV - реализация, в общем виде
select t1.* from products as t1 where t1.id in (
select t2.id from (
select id, count(*) from product_attribute_value as t3
where (t3.attribute_id = 11 and t3.value = 'value1')
or (t3.attribute_id = 42 and t3.value > 'value2')
having t3.count == 2# количество атрибутов по которым фильтруем
) as t2 )
barkar@mail.ru
А количество товаров в этой ссылке кто проставит

Например:
/odezhda/termobelje

Фильтр

Производитель
Craft 2шт
X-Bionic 10шт
Marmot 20шт
...

Выводится фильтры только больше 0.

Я же дал ссылку на пример

vital
Цитата (barkar@mail.ru @ 30.05.2014 - 11:42)
А количество товаров в этой ссылке кто проставит

Например:
/odezhda/termobelje

Фильтр

Производитель
Craft 2шт
X-Bionic 10шт
Marmot 20шт
...

Выводится фильтры только больше 0.

Я же дал ссылку на пример

Нужно учить SQL перед тем как спрашивать на форумах, нужно учить SQL, нужно..

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
barkar@mail.ru
Серьезно а на пример. Или Ваш уровень конструктивной критики заканчивается выше изложенным.
barkar@mail.ru
Цитата (sergeiss @ 30.05.2014 - 12:00)
Цитата (barkar@mail.ru @ 30.05.2014 - 11:07)
Реализация такова:...

Такой реализацией ты извратил саму суть запросов и вообще СУБД. Твои действия напоминают примерно такие:
1. Выкладываем из шкафа все вещи.
2. Выбираем все вещи с определенной полки, согласно определенным критериям.
3. Перебираем все вещи по одной, оценивая цвет, фактуру, размер...

...в итоге достаем носки, ради которых все и было затеяно smile.gif

Как ты думаешь, имеет смысл вынимать все вещи из шкафа ради пары носков? Или лучше просто залезть на ту полку, где они лежат, и взять?

Это я к тому, что тебе надо изучить, что такое вообще БД, как делаются запросы. В частности (очень понадобится), что такое JOIN и как работает. А заодно WHERE - ограничения (фильтры) на выборку. Также LIMIT пригодится...

Пример просмотрите пример потом говорите про мои способности писать запросы к БД, JOIN (объединение запросов использовать не хочу ибо посоветовали оптимизаторы, мол два простых запроса легче чем один сложный с JOIN).
T1grOK
Цитата (barkar@mail.ru @ 2.06.2014 - 16:12)
объединение запросов использовать не хочу ибо посоветовали оптимизаторы, мол два простых запроса легче чем один сложный с JOIN

Ну да. Лучше сделать 100500 простых запросов или выгребти из базы кучу лишней инфы...очень оптимально...

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
sergeiss
Так я вот что не понял. Ты задал вопрос (начало темы). Тебе ответили, что алгоритм не совсем верный. Ты утверждаешь, что всё верно, но "что-то долго работает". Может быть и верный алгоритм и запрос(ы) к БД. Возможно, что тебя неправильно поняли (что маловероятно).

Но где, чёрт побери, хоть одна строчка твоего кода, хоть один твой запрос?

Если хочешь получить ответ, то покажи свой код, который долго работает. И будем вместе думать, как его оптимизировать.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
kaww
barkar@mail.ru, для eav модели значения по всем фильтрам можно получить одним запросом. После того как выбрали все ид товаров просто делаем запрос по таблице значений атрибутов вида:
select attribute_id, value, count(*) as count from product_attribute_value where product_id in ($productIds) group by attribute_id, value
Таким образом получим количество результатов для всех значений всех атрибутов
barkar@mail.ru
Цитата (kaww @ 2.06.2014 - 20:30)
barkar@mail.ru, для eav модели значения по всем фильтрам можно получить одним запросом. После того как выбрали все ид товаров просто делаем запрос по таблице значений атрибутов вида:
select attribute_id, value, count(*) as count from product_attribute_value where product_id in ($productIds) group by attribute_id, value
Таким образом получим количество результатов для всех значений всех атрибутов

Прошу прощения с этой моделью я не знаком (EAV).
barkar@mail.ru
Цитата (sergeiss @ 2.06.2014 - 20:29)
Так я вот что не понял. Ты задал вопрос (начало темы). Тебе ответили, что алгоритм не совсем верный. Ты утверждаешь, что всё верно, но "что-то долго работает". Может быть и верный алгоритм и запрос(ы) к БД. Возможно, что тебя неправильно поняли (что маловероятно).

Но где, чёрт побери, хоть одна строчка твоего кода, хоть один твой запрос?

Если хочешь получить ответ, то покажи свой код, который долго работает. И будем вместе думать, как его оптимизировать.



//типы таблиц MyISAM
//Выборка по фильтру:

$_FLTR = 'SELECT * FROM filter WHERE type = 'kurtki' or type = 'all'';
$_FLTR = mysql_query($_FLTR);

//Выборка по категории:
$odezhda = 'SELECT id,url,type,color,color_main,brend,podtype,h1,price,sex,profil FROM odezhda WHERE type = 'kurtki' ORDER BY price ASC';
$odezhda = mysql_query($odezhda );

$count = 0;
while($item = mysql_fetch_assoc($odezhda )):
//Вывод
if ($count >= $start && $count < $do) {
$article .= '<article class="list">Реализация контента</article>';
}

/* Проставляет количество товаров по фильтру. Задает значение SIZE */
$_FLTR = dg_fltr($_FLTR, $l_fltr, $item);
++
$count;
endwhile;
barkar@mail.ru
Цитата (T1grOK @ 2.06.2014 - 20:29)
Цитата (barkar@mail.ru @ 2.06.2014 - 16:12)
объединение запросов использовать не хочу ибо посоветовали оптимизаторы, мол два простых запроса легче чем один сложный с JOIN

Ну да. Лучше сделать 100500 простых запросов или выгребти из базы кучу лишней инфы...очень оптимально...

Да но у меня всего один запрос а не 100500, к чему ваша реплика
kaww
Цитата (barkar@mail.ru @ 3.06.2014 - 09:36)
Прошу прощения с этой моделью я не знаком (EAV).
, Entity-Attribute-Value Data Model в гугле много информации можно найти.

Судя по всему вы храните атрибуты как поля в таблице товаров. В этом случае, действительно, посчитать сколько товаров останется при добавлении фильтра достаточно проблематично. Как вариант можно построить таблицу вида [product_id, attribute_name, value], в которой продублировать значения атрибутов (которые используются в фильтрах) товаров из таблицы продуктов:
|------------------------------------|
|product_id | attribute_name | value |
|------------------------------------|
|1 |color |red |
|------------------------------------|
|2 |color |black |
|------------------------------------|
|3 |brand |nokia |
|------------------------------------|

Тогда можно воспользоваться запросом из моего предыдущего поста
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.