2015-12-02 4 views
0

Я пытаюсь улучшить выполнение какого-либо запроса, который объединяет две таблицы, я добавил индекс с именем skuconf для colum SKUConfig в таблицу gio_A_Master_SL_temp и индекс с именем skuconf для sku_config столбца в таблице gio_cat_hist_SL_temp, но я могу видеть команду объяснить, что индексы не используются в соединении таблиц (только в создании производных таблиц)Индексы, которые не используются в соединении mysql

здесь запрос

EXPLAIN SELECT 
a.Country, 
a.MonthNum, 
a.CatBP, 
a.Cat1, 
a.Cat2, 
a.Cat3, 
sum(a.SKU_sold) as SKU_sold, 
sum(a.items) AS items, 
sum(a.Revenue) AS revenue, 
sum(b.SKU_visible) AS SKU_visible 

FROM 

     (SELECT 
      Country, 
      MonthNum, 
      SKUConfig, 
      CatBP, 
      Cat1, 
      Cat2, 
      Cat3, 
      count(DISTINCT SKUConfig) AS SKU_sold, 
      sum(OrderAfterCan) AS items, 
      sum(NMV) AS Revenue 
     FROM 
      gio_A_Master_SL_temp 

     GROUP BY 
      SKUConfig) a 


     LEFT JOIN 

     (SELECT 
      sku_config, 

      count(*) AS SKU_Visible 
     FROM 
      gio_cat_hist_SL_temp 

     GROUP BY 
      sku_config) b ON a.SKUConfig = b.sku_config 

GROUP BY a.CatBP, a.Cat1, a.Cat2, a.Cat3 
; 

и вот изображение результатов EXPLAIN

EXPLAIN RESULT

Столбцы я добавил индексы для типа являются VARCHAR (28), и оба из них имеют те же параметры сортировки, как показывают по команде SHOW FULL COLUMN

SKUconfig varchar(28) utf8_general_ci YES MUL   select,insert,update,references 
sku_config varchar(28) utf8_general_ci YES MUL   select,insert,update,references 

Я не знаю, whay индексы не используются соединением, есть ли способ заставить индекс работать для соединения таблиц ?. Также приветствуется любая рекомендация по улучшению запроса. заранее спасибо.

+0

Насколько велики таблицы? Использование индекса, а затем поиск имеет стоимость, поэтому иногда cheapper просто выполняет полное сканирование. Также вы присоединяетесь к индексированным таблицам. Вы создаете временную таблицу с 'group by'. –

+0

@JuanCarlosOropeza Даже без 'group by', подзапросы, вероятно, исключают индексы из рассмотрения в' join' (хотя они могут помочь разделить 'group' s. – Uueerdo

+0

@Uueerdo Это то, что я сказал, когда упоминаю временную таблицу , isnt? –

ответ

0

Попробуйте это:

(SELECT 
     a.Country, 
     a.MonthNum, 
     a.SKUConfig, 
     a.CatBP, 
     a.Cat1, 
     a.Cat2, 
     a.Cat3, 
     count(DISTINCT a.SKUConfig) AS SKU_sold, 
     sum(a.OrderAfterCan) AS items, 
     sum(a.NMV) AS Revenue, 
     count(b.SKUConfig) AS SKU_Visible 
    FROM 
     gio_A_Master_SL_temp a 
    LEFT JOIN 
     gio_cat_hist_SL_temp b 
     ON 
     a.SKUConfig = b.sku_config 
    GROUP BY 
     SKUConfig 
) combine_result 
+0

Нет. Он будет логически выполнять JOIN перед выполнением отдельных SUM и COUNT. Следовательно, числа будут завышены. –