Как ускорить поиск по бд MySQL?

Хотелось бы понять как можно ускорить поиск товаров в базе данных MySQL, когда приходится использовать большое количество Id категорий в in. У меня увеличивается количество подкатегорий, неизвестно сколько будет, но допустим 10 000 тыс в общей сложности, структура такая, основная категория -> подкатегория -> подкатегория -> возможно ещё одна категория. Я открываю страницу с основной категорией, где высыпается каталог продукции соответствующей всем подкатегориям основной категории, т.е захватываю абсолютно все вложенные категории, и соответственно формируется такой запрос (and table.product in (сто штук id подкатегорий)), я понимаю, что в дальнейшем, чем больше товаров будет и чем больше категорий, тем медленнее будет запрос, а он уже достаточно медленный «0.0090» сек учитывая group_concat содержащийся в запросе и 3 left join’а. Сейчас всего 15 тыс позиций в бд, а что будет, когда станет 500 тыс позиций, как быть чтобы не использовать 100 штук id категорий при выборке?
  • Вопрос задан
  • 860 просмотров
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Добавить категории и товарам Materialized Path. Тогда вместо IN будет индексируемый LIKE.
Ответ написан
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Хотелось бы понять как можно ускорить поиск товаров в базе данных MySQL, когда приходится использовать большое количество Id категорий в in.


Дело не в большом количестве, а в том, сколько уходит времени на поиск одной. Если у колонки нет индекса, то поиск любого количества будет медленным. А если есть индекс, то будет быстрым.

Плюс непонятно, с чего вы решили, что проблема именно в in. Если у вас сто тыщ товаров, и все их надо отсортировать или сгруппировать, то проблема вообще не в in. А в той самой сортировке или группировке. И надо подбирать составной индекс специально под них.

Чтобы ускорить поиск по бд MySQL, надо не писать на тостер глубокомысленные умозаключения про три джойна и сто тыщ товаров, а выполнить команду EXPLAIN и начинать тупить в её вывод. или по крайней мере привести его в своем вопросе, чтобы он стал предметным.
Ответ написан
Steel_Balls
@Steel_Balls
0L3QsNGH0LjQvdCw0Lsg0YEgQkFTSUMg0L3QsCDQo9Ca0J3Qpi
В первую очередь надо построить индексы по тем полям, по которым будет производиться поиск
Ответ написан
batyrmastyr
@batyrmastyr
Сымитируйте ваши 100500 категорий.
Если нужно ускорять, то вас спасёт денормализация: в дополнение к идентификатору текущей категории (category_id) у товаров появятся идентификаторы категорий высоких уровней (category_level1_id, category_level2_id, category_level3_id) и на первых уровнях фильтровать по выделенным столбцам.

Цена: усложнение логики, новые индексы, нужно периодически запускать скрипт исправляющий значения в новых колонках после перетасовки категорий.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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