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 уже выполнен, в голову не пришло.
			
				Последнее редактирование: