MYSQL不使用创建的索引

MYSQL不使用创建的索引,mysql,sql,indexing,Mysql,Sql,Indexing,我有一个带聚集索引的表 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_

我有一个带聚集索引的表

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

为什么我的索引
区域\u CD\u 3
没有被使用?如何优化该查询和索引?

在该查询中,只有该索引的前两列是有用的,因为针对索引第二列的范围查询。必须扫描最后两列中的值

更改索引定义以将范围列移动到末尾:

(region_cd, HR_rollup, sls_dist_chnl_type_cd, Activity_mth)
另外,将GROUPBY子句更改为将活动放在最后,并按索引顺序引用所有其他列

GROUP BY region_cd, HR_rollup, sls_dist_chnl_type_cd, Activity_mth

这将为优化器提供一个理想的查询索引,并提示优化器可以通过读取此索引而不是其他索引来避免大量不必要的工作。

您可以发布相关表的结构和一些测试数据吗?使用将有助于更好地帮助您。