likeapimp
@likeapimp
web dev, web design

Как правильно создать индексы mysql?

Добрый день! Подскажите, как правильно создать индексы для такого запроса, чтобы ускорить его выполнение?

select min(price) as min, max(price) as max from `goods` 
left join `goods_categories` on `goods`.`id` = `goods_categories`.`product_id` 
where (`status` = ?) and (`catid` in (?, ?, ?, ?) or `goods_categories`.`category_id` in (?, ?, ?, ?)) 
limit 1
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
union забудьте. кейсы оправданности его использования крайне редки, вряд ли он вам вообще когда-нибудь понадобится на продакшне. в общем случае это очень тяжелая операция и мускул не умеет ее оптимизировать. и никогда не научится.

сделайте по-человечески... добавьте в goods_categories запись про основную категорию (с флагом при необходимости соответствующих выборок). тогда движку не нужно будет строить пересечение индексов при выборке (мускул такого тоже не любит).

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

добавлю также, что эти самые max min цен, да и количество нафик никому не интересны.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
Я так понимаю что главная задача - убрать перемножение таблиц.
По идее должно быть достаточно добавить индекс на product_id.
тогда во второй строке в rows должна появиться единичка

Если это реальные цифры количества строк в таблицах, то больше вообще никакие индексы не нужны.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы