vanyahuk
@vanyahuk

Как оптимизировать сложный sql запрос?

здраствуйте, есть 3 таблицы
bc73f03c0e2e4f96ae2da1cd1e8178eb.png

таблица category_products связывает категорию с продуктами, но там более 600к записей и в таблице products более 350к, inner join, left join работали, пока товаров не стало совсем много, все было бы ничего, если ненужно сортировки по названию, цене и просмотрах

вот сам sql запрос
SELECT  `products`.`id` ,  `products`.`title` ,  `products`.`slug` ,  `products`.`label` ,  `products`.`price` ,  `products`.`old_price` , `products`.`category_id` ,  `products`.`picture_id` ,  `products`.`brand_id` ,  `category_products`.`category_id` AS `pivot_category_id` ,  `category_products`.`product_id` AS  `pivot_product_id` 
FROM  `products` 
INNER JOIN  `category_products` ON  `products`.`id` =  `category_products`.`product_id` 
WHERE  `category_products`.`category_id` =  '2067'
GROUP BY  `products`.`id` 
ORDER BY  `products`.`views` DESC 
LIMIT 24
  • Вопрос задан
  • 786 просмотров
Пригласить эксперта
Ответы на вопрос 3
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Добавить индексы на таблицы по тем столбцам, через которые идет соединение таблиц. Добавить индексы по столбцам, по которым идет группировка. Смотреть план запроса, думать, мучить гугл.
Ответ написан
Fragster
@Fragster
помогло? отметь решением!
Добавьте промежуточную таблицу с данными в нужном виде, обновляйте кодом при апдейте основной таблицы/триггером/по расписанию. Денормализация - нормальный прием повышения производительности.
Ответ написан
@BorisKorobkov Куратор тега MySQL
Web developer
Избавиться от join. Выбирать только
SELECT * FROM products ORDER BY views DESC LIMIT 24

А потом для выбранных 24 товаров выбрать категории. Например, результат вышеуказанного запроса в CREATE TEMPORARY TABLE ... и уже ее join product_category.

Создать индексы по views и связанным полям.

P.S. У вас запрос неправильный. Потому что нельзя SELECT category_products.category_id, когда GROUP BY products.id
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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