@kamisarlapsha

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

Привет! Как можно оптимизировать данный запрос ? Индексы (primary) по тем полям где join стоят. Есть индекс (status, date_available) и (path_id, category_id). Пытался добавить составной индекс для order by, но он ничего прироста скорости не даёт. Ещё в oc_category_path и order by используется filesort, как можно избавиться от этого ?
SELECT
				`fgd`.`name` AS `gname`,
				`fgd`.`mf_tooltip` AS `tooltip`,
				`f`.`filter_group_id`,
				`f`.`filter_id`,
				`fd`.`name`
			FROM
				`oc_product` AS `p`
			INNER JOIN
				`oc_product_filter` AS `pf`
			ON
				`p`.`product_id` = `pf`.`product_id`
			INNER JOIN
				`oc_filter` AS `f`
			ON
				`pf`.`filter_id` = `f`.`filter_id`
			INNER JOIN
				`oc_filter_description` AS `fd`
			ON
				`pf`.`filter_id` = `fd`.`filter_id`
			INNER JOIN
				`oc_filter_group_description` AS `fgd`
			ON
				`f`.`filter_group_id` = `fgd`.`filter_group_id`
			
			INNER JOIN
				`oc_product_to_category` AS `p2c`
			ON
				`p2c`.`product_id` = `p`.`product_id`
		
			WHERE
				`p`.`status` = '1' AND `p`.`date_available` <= NOW() AND `p2c`.`category_id` IN(SELECT `category_id` FROM `oc_category_path` WHERE `path_id` IN(66))
GROUP BY
				`f`.`filter_group_id`, `f`.`filter_id`
			ORDER BY
				`f`.`sort_order`, `fd`.`name`


Вот explain запроса:
5db0f3a65d6a0703832951.png
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Если oc_product_to_category - это сильно нагруженная таблица, можете вынести саб селект в отдельный запрос.
Как вариант - можете покурить на тему уровней изоляции транзакций с неблокирующим чтением.
Если приведенный скрин - не с продакшна, у меня для вас плохие новости: explain может спокойно не соответствовать локальному.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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