查询执行因订单大幅减慢

时间:2015-10-08 20:48:50

标签: mysql indexing

我有以下查询

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行。

存在以下索引:

  1. area_cd(area_cd,activity_dt)
  2. activity_dt(activity_dt,mkt_cd)
  3. region_cd(region_cd,mkt_cd_activity_dt)
  4. mkt_cd(mkt,activity_dt)
  5. 这是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列上创建索引。

1 个答案:

答案 0 :(得分:0)

对于索引我认为你需要一个字段:

  activity_dt, mkt_cd, ga 

按此顺序。通过这种方式,select应解决索引中的所有信息需求,避免访问表数据。