2014-09-04 83 views
1

我有一个聚集索引表。MYSQL不使用创建索引

Index(region_cd, Activity_mth, HR_rollup, sls_dist_chnl_type_cd) called REGION_CD_3 
Index(Activity_mth) 

当我执行以下查询

EXPLAIN EXTENDED SELECT 
    ACTIVITY_MTH, 
    SUM(CASE WHEN m2m_ind = 'N' THEN TOT_GA ELSE 0 END) AS GA, 
    SUM(CASE WHEN m2m_ind = 'N' THEN TOT_GA_PY ELSE 0 END) 
FROM 
    b2b_dashboard_data_dly 
WHERE region_cd = 'PH' 
    AND ACTIVITY_MTH BETWEEN '2014-04-01' AND '2014-09-30' 
    AND HR_ROLLUP = 'historical' 
    AND SLS_DIST_CHNL_TYPE_CD = 'b2b' 
GROUP BY ACTIVITY_MTH 

我得到的解释以下回应。

id | select_type | table     | type   | possible_keys                                       -     | key           | key_len | ref | rows | filtered | Extra 
1 | SIMPLE  | b2b_dashboard_data_dly | index_merge |REP_HR_EMP_ID,MGR_HR_EMP_ID,AD_HR_EMP_ID,REGION_CD,AREA_CD,ACTIVITY_MTH,HR_ROLLUP,REGION_CD_2,SLS_DIST_CHNL_TYPE_CD,REP_HR_EMP_ID_3,MGR_HR_EMP_ID_3,AD_HR_EMP_ID_3,REGION_CD_3,AREA_CD_3 | REGION_CD_2,HR_ROLLUP,SLS_DIST_CHNL_TYPE_CD | 93,33,48 | null | 11480 | 75  | Using intersect(REGION_CD_2,HR_ROLLUP,SLS_DIST_CHNL_TYPE_CD); Using where; Using temporary; Using filesort 

为什么我的索引REGION_CD_3没有被使用?我怎样才能优化这个查询和我的索引?

+0

你可以发布涉及的表的结构和一些测试数据吗?使用[SQL Fiddle](http://sqlfiddle.com/)将有助于更好地帮助您。 – wchiquito 2014-09-04 14:35:21

回答

0

在此查询中,由于索引的第二列的范围查询,只有该索引的前两列才有用。最后两列中的值必须被扫描。

更改索引定义的范围列移动到端:

(region_cd, HR_rollup, sls_dist_chnl_type_cd, Activity_mth) 

另外,通过子句更改组把Activity_mth最后和参考的所有其他列的索引顺序。

GROUP BY region_cd, HR_rollup, sls_dist_chnl_type_cd, Activity_mth 

这应该给优化器用于查询的理想指标,一个暗示,它可以通过,而不是任何其他该指数读数避免很多不必要的工作。