Нужен совет. Имеется проект интернет-магазина. Товаров около 45 тыс.
Каждый товар обладает некоторыми свойствами, у всех товаров различный набор свойств.
Свойств около 150 шт. Товар может содержать несколько значений одного свойства.
Уникальных значений свойств всего около 130 тыс.
Индексы у всех таблиц проставлены, проверял запрос через explain, все связи идут с использованием ключей.
При фильтрации и выборе большого числа свойств в фильтре, проседает скорость, вместо 1-2 сек, страница генерируется временами 8-10 сек. Может кто сталкивался с подобным и знает пути решения проблемы, ссылки приветствуются :-)
Может кто то решал подобное с использованием поисковых движков типа ElasticSearch или Sphinx?
Заранее спасибо!
Связь таблиц следующая:
Products (45 тыс. записей):
product_id int,
name varchar(150),
...
Properties (~150 записей):
property_id int,
name varchar(100),
...
Properties_Values (~130 тыс. записей):
value_id int,
property_id int (связь с таблицей Properties),
value varchar(100),
...
Products_Values (~600-650 тыс. записей):
product_id int (связь с таблицей Products),
value_id int (связь с таблицей Properties_Values),
Есть множество решений - Сфинкс, эластик, PostgreSQL Textsearch, PostgreSQL HStore.
Но с таким количеством записей вполне может справится и обычный MySQL без проседаний в скорости, главное оптимизировать запрос.
Можете предоставить пример генерируемого запроса? Дам советы как избавиться от проседаний, и довести время поиска до <500 мс.
Вот пример запроса, который возвращает для одного свойства в фильтре набор свойств для категории и ее подкатегорий (чтобы не показывать лишние значения свойств, которых нет в данной категории):
FROM mc_tags t
INNER JOIN mc_tags_groups tg ON t.group_id = tg.id
INNER JOIN mc_tags_products tp ON t.id = tp.tag_id
INNER JOIN mc_products_categories pc ON tp.product_id = pc.product_id
INNER JOIN mc_categories cats ON pc.category_id = cats.id
INNER JOIN mc_products p ON pc.product_id = p.id
INNER JOIN mc_products_properties props ON p.id=props.product_id
WHERE 1
AND pc.category_id in (5496,5497,5498,5714,5715,5716,5717,5718,5719,5720,5721,6250,6252,7249,7250,7251,7252,7253,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,9120,10963,10986,10987,10988,10989,5495,5504,5541,5619,5638,5693,5694,5695,5697,5709,5710,5711,5712,5713,5984,6051,6276,6277,6278,6608,6862,7187,7280,7304,7407,7516,8809,9284,9293,11000,5503,5510)
AND p.visible=1
AND cats.visible=1
AND pc.position=0
AND p.add_flag1=0
AND tg.id in (13)
AND t.enabled=1
ORDER BY t.name
Без кеша отрабатывает за 0.2 сек.
Но когда в фильтре много различных свойств, то приходится по очереди отбирать значения для каждого свойства, и если таких свойств в фильтре порядка 15 шт, то это уже 3 секунды + потом отбираются товары на основе этих выбранных свойств (+0.2-0.3 секунды).