как избежать using temporary table в случае group by и inner join

Статус
В этой теме нельзя размещать новые ответы.

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Привет.
Пытаюсь оптимизировать долгие запросы. Таблица 7.5млн. строк, к которой делается inner join.

Код:
SELECT SQL_NO_CACHE po.feature_id, po.value, po.translit
FROM t_cat3_options po
INNER JOIN s_products_categories pc ON pc.product_id = po.product_id
AND pc.category_id
IN (
'5', '14', '47', '6', '8', '132', '10', '11', '16', '7', '62', '93', '9', '12', '13', '18', '94', '37', '17', '48', '150', '15', '25', '20', '95', '143', '147', '19', '138', '148', '4'
)
WHERE 1
AND po.lang_id = '1'
AND po.feature_id
IN (
'25', '2', '9', '13', '16', '24', '17', '18', '19', '20', '21', '22', '26', '31'
)
GROUP BY po.feature_id, po.value
ORDER BY NULL

Это сам запрос. Можно ли вообще в таком случае добиться исключения temporary table?


Вопрос снимается. Вот решение:

Код:
SELECT SQL_NO_CACHE pos.* from
(
  SELECT  po.feature_id, po.value, po.translit, po.product_id
FROM t_cat3_options po

WHERE 1

AND po.lang_id = '1'
AND po.feature_id
IN (
'25', '2', '9', '13', '16', '24', '17', '18', '19', '20', '21', '22', '26', '31'
)


GROUP BY po.feature_id, po.value
ORDER BY NULL
) pos

INNER JOIN s_products_categories pc ON pc.product_id = pos.product_id
AND pc.category_id
IN (
'5', '14', '47', '6', '8', '132', '10', '11', '16', '7', '62', '93', '9', '12', '13', '18', '94', '37', '17', '48', '150', '15', '25', '20', '95', '143', '147', '19', '138', '148', '4'
)
Используется 2 составных индекса
в таблице po:
feature_id value translit category_id lang_id product_id
в таблице pc:
category_id, product_id



EXPLAIN

Extra


Using where; Using index

NULL

Using where; Using index


К сожалению так получается криво. Группировать до join нельзя. Непременно нужно сделать сначала join, потом только group by.

Ничего лучше, как сделать гигантскую таблицу, где join уже выполнен, в голову не пришло.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху