babahalki
Постоялец
- Регистрация
- 6 Май 2016
- Сообщения
- 247
- Реакции
- 107
- Автор темы
- #1
Привет.
Пытаюсь оптимизировать долгие запросы. Таблица 7.5млн. строк, к которой делается inner join.
Это сам запрос. Можно ли вообще в таком случае добиться исключения temporary table?
Вопрос снимается. Вот решение:
Используется 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 уже выполнен, в голову не пришло.
Пытаюсь оптимизировать долгие запросы. Таблица 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'
)
в таблице 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 уже выполнен, в голову не пришло.
Последнее редактирование: