2015-12-02 56 views
0

我试图提高连接两个表的某些查询的性能,我已经为表gio_A_Master_SL_temp和一个名为skuconf的索引添加了一个名为skuconf的索引,用于将colum SKUConfig添加到表中在表gio_cat_hist_SL_temp列sku_config,但我可以通过解释命令来查看未在表(仅在创建派生表)未在连接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 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

有多大的表?使用索引然后查找会产生成本,所以有时候只需进行全面扫描便宜。你还没有加入索引表。你正在用'group by'创建一个临时表。 –

+0

@JuanCarlosOropeza即使没有'group by',subquerying可能会消除'join'中考虑的索引(尽管它们可能有助于分离出'group by's。 – Uueerdo

+0

@Uererdo这就是我在提到临时表时所说的,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

不需要。在执行单个SUM和COUNT之前,它将在逻辑上执行JOIN。因此,这些数字将会膨胀。 –