2014-09-04 75 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 

這應該給優化器用於查詢的理想指標,一個暗示,它可以通過,而不是任何其他該指數讀數避免很多不必要的工作。