我有以下查询
SELECt
SUM(GA) AS GA1,
sales_data_mkt.mkt_cd
FROM
sales_data_mkt
WHERE activity_dt between '2015-09-01'
AND '2015-09-30'
and sales_data_mkt.MKT_CD is not null
GROUP BY sales_data_mkt.mkt_cd
HAVING ga1 > 0
LIMIT 10
Its Explain
执行时间:6-7秒
id select_type table type possible_keys key key_len ref rows Extra;
1 SIMPLE sales_data_mkt range ACTIVITY_DT,REGION_CD,MKT_CD MKT_CD 13 null 4954774 Using where
现在我添加order by
子句
EXPLAIN SELECT
SUM(GA) AS GA1,
sales_data_mkt.mkt_cd
FROM
sales_data_mkt
WHERE activity_dt BETWEEN '2015-09-01'
AND '2015-09-30'
AND sales_data_mkt.MKT_CD IS NOT NULL
GROUP BY sales_data_mkt.mkt_cd
HAVING ga1 > 0
ORDER BY SUM(ga) DESC
LIMIT 10
Its Explain
执行时间:600秒
id select_type table type possible_keys key key_len ref rows Extra;
1 SIMPLE sales_data_mkt range ACTIVITY_DT,REGION_CD,MKT_CD MKT_CD 13 null 4954774 Using where\; Using temporary\; Using filesort
sales_data_mkt
有10M行。最低activity_dt
2015年1月1日,最高 2015年10月6日。基本上每月大约1M行。
存在以下索引:
这是create语句:
CREATE TABLE `sales_data_mkt` (
`ACTIVITY_DT` date DEFAULT NULL,
`Country_Cd` char(3) NOT NULL DEFAULT 'USA',
`AREA_CD` char(2) DEFAULT NULL,
`AREA_DESC` varchar(30) DEFAULT NULL,
`REGION_CD` char(2) DEFAULT NULL,
`REGION_DESC` varchar(30) DEFAULT NULL,
`MKT_CD` char(4) DEFAULT NULL,
`MKT_NAME` varchar(30) DEFAULT NULL,
`device_tier` varchar(32) DEFAULT NULL,
`SLS_DIST_CHNL_TYPE_CD` char(3) DEFAULT NULL,
`PPlan_Type` varchar(14) DEFAULT NULL,
`PREPAID_IND` char(1) DEFAULT NULL,
`edge_taken_ind` varchar(1) DEFAULT NULL,
`Edge_Desc` varchar(16) DEFAULT NULL,
`Data_Plan_Tier` varchar(26) DEFAULT NULL,
`Unlimited_to_Others_cnt` int(11) DEFAULT NULL,
`Data_Step_UP_Cnt` int(11) DEFAULT NULL,
`Data_Step_Down_Cnt` int(11) DEFAULT NULL,
`lines` int(11) DEFAULT NULL,
`GA` int(11) DEFAULT NULL,
`DE` int(11) DEFAULT NULL,
`NetAdd` int(11) DEFAULT NULL,
`VOL_DE` int(11) DEFAULT NULL,
`INVOL_DE` int(11) DEFAULT NULL,
`PortIn_ATT_Leap` int(11) DEFAULT NULL,
`PortIn_Sprint_Nextel` int(11) DEFAULT NULL,
`PortIn_TMobile_MetroPcs` int(11) DEFAULT NULL,
`PortIn_OtherCarriers` int(11) DEFAULT NULL,
`PortOut_ATT_Leap` int(11) DEFAULT NULL,
`PortOut_Sprint_Nextel` int(11) DEFAULT NULL,
`PortOut_TMobile_MetroPcs` int(11) DEFAULT NULL,
`PortOut_OtherCarriers` int(11) DEFAULT NULL,
`Edge_Net_Sales` int(11) DEFAULT NULL,
`Edge_Eligible_Net_Sales` int(11) DEFAULT NULL,
`Edge_Net_Sales_All` int(11) DEFAULT NULL,
`Basic_To_Smart` int(11) DEFAULT NULL,
`AAL` int(11) DEFAULT NULL,
`New_To_VZ` int(11) DEFAULT NULL,
`Trade_In` int(11) DEFAULT NULL,
`Unlimited_to_Others` int(11) DEFAULT NULL,
`Data_Step_Up` int(11) DEFAULT NULL,
`Data_Step_Down` int(11) DEFAULT NULL,
KEY `AREA_CD` (`AREA_CD`,`ACTIVITY_DT`),
KEY `ACTIVITY_DT` (`ACTIVITY_DT`,`MKT_CD`),
KEY `REGION_CD` (`REGION_CD`,`MKT_CD`,`ACTIVITY_DT`),
KEY `MKT_CD` (`MKT_CD`,`ACTIVITY_DT`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我需要哪些索引才能提高性能?
Note:
就像GA
列的查询一样,我对表中的其他列有其他查询。这让我很害怕在GA
和表中的每个其他KPI列上创建索引。
答案 0 :(得分:0)
对于索引我认为你需要一个字段:
activity_dt, mkt_cd, ga
按此顺序。通过这种方式,select应解决索引中的所有信息需求,避免访问表数据。