Реализация фасетного (фасеточного) поиска на mysql

Добрый день, хочу реализовать фасетный поиск на mysql. По сути это колонка с фильтрами которая очень часто используется для фильтрации товаров в интернет магазине. Например в магенто
Сами данные хранятся в виде «ид товара» «ид атрибута» «ид фильтра»

И по реализации этой штуки возник ряд вопросов.

1) как быстро посчитать количество фильтра? В указанном мной примере, по ссылке, указывается количество товаров с указанным фильтров.

2)Как лучше хранить в таблице сами фильтры если их несколько для одного атрибута? Через запятую или каждый фильтр в отдельном рядке?

3)Будет ли получен существенный прирост при использовании типа таблиц MEMORY если ожидается 300к записей?

p.s. Чтобы было понятнее атрибут — это группа фильтров, фильтр это значения по которым фильтруем

p.s.s Очень хотелось бы сделать это на php mysql без использования сторонних фреймворков.
  • Вопрос задан
  • 6270 просмотров
Пригласить эксперта
Ответы на вопрос 2
@TimTowdy
Речь, как я понимаю, идёт о EAV.
Теоретически, в случае использования MEMORY-таблиц, прирост должен быть, т.к. в EAV чтение каждого поля вызывает позиционирование головки винчестера, поэтому чтение из памяти должно быть быстрее.
В целом, РСУБД плохо подходят для реализации фасеточного поиска. Обычно тормоза такого поиска исправляют поисковыми движками, типа сфинкса, но лучше посмотреть в сторону nosql — mongodb, couchdb, etc.
Ответ написан
Комментировать
@mitnlag
1) как-как… Magento использует сложную абстрактную модель, которая интересным образом коммуницирует с бд. Изменения напрямую в БД смерти подобны — все надо делать через magento api. А для общего случая — все айди целочисленные, вешайте на них составные индексы, все будет считаться быстро.

2) в отдельном рядке.

3) 300 к скорее сам движок закеширует. Тот же MEMORY по факту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы