2016-06-01 78 views
2

目前我正在处理大约600K的记录,下面的查询需要大约6.5秒来获取结果。MySql索引和查询优化以及最短执行时间

有人能帮我减少执行时间到2-3秒吗?

查询1:

SELECT DATE_FORMAT(`LS_CHG_DTE_OCR`, '%Y-%b') AS fmt_date, SUM(connects) AS connects, 
     SUM(disconnects) AS disconnects, ROUND(SUM(REV),0) AS REV 
    FROM 
     (SELECT LS_CHG_DTE_OCR, 
       IF(`TYPE`='Connect',COUNT(DISTINCT ORDER_NO_OHI), 0) AS connects, 
       IF(`TYPE`='Disconnect',COUNT(DISTINCT ORDER_NO_OHI), 0) AS disconnects, 
       IF(`TYPE`='Upgrade',COUNT(DISTINCT ORDER_NO_OHI), 0) AS Upgrades, 
       IF(`TYPE`='Downgrades',COUNT(DISTINCT ORDER_NO_OHI), 0) AS Downgrades, 
       SUM(IF(`TYPE`='Connect',REV,0)) AS REV 
      FROM hsd_26_05_2016 
      WHERE LS_CHG_DTE_OCR!='' 
      GROUP BY LS_CHG_DTE_OCR,TYPE 
    ) AS a 
    GROUP BY YEAR(LS_CHG_DTE_OCR), MONTH(LS_CHG_DTE_OCR) 
    ORDER BY LS_CHG_DTE_OCR ASC; 

QUERY 2:

CREATE TABLE `hsd_26_05_2016` (
     `id` int(20) NOT NULL AUTO_INCREMENT, 
     `SYS_OCR` varchar(255) DEFAULT NULL, 
     `PRIN_OCR` varchar(255) DEFAULT NULL, 
     `ORDER_NO_OHI` varchar(255) NOT NULL, 
     `SUB_ACCT_NO_OHI` varchar(255) DEFAULT NULL, 
     `SERV_CDE_OHI` varchar(255) DEFAULT NULL, 
     `DSC_CDE_OHI` varchar(255) DEFAULT NULL, 
     `LS_CHG_DTE_OCR` date NOT NULL, 
     `SALESREP_OCR` varchar(255) DEFAULT NULL, 
     `CHANNEL` varchar(255) DEFAULT NULL, 
     `CUST_TYPE` varchar(255) DEFAULT NULL, 
     `LINE_BUS` varchar(255) DEFAULT NULL, 
     `ADDR1_HSE` varchar(255) DEFAULT NULL, 
     `RES_CITY_HSE` varchar(255) DEFAULT NULL, 
     `RES_STATE_HSE` varchar(255) DEFAULT NULL, 
     `POSTAL_CDE_HSE` varchar(255) DEFAULT NULL, 
     `ZIP` varchar(10) DEFAULT NULL, 
     `COUNT_SUBS` double DEFAULT NULL, 
     `REV` double NOT NULL, 
     `TYPE` varchar(255) NOT NULL, 
     `SERVICECATEGORY` varchar(200) DEFAULT NULL, 
     `lat` varchar(100) DEFAULT NULL, 
     `long` varchar(100) DEFAULT NULL, 
     PRIMARY KEY (`id`,`LS_CHG_DTE_OCR`,`TYPE`,`ORDER_NO_OHI`), 
     KEY `idx2` (`CHANNEL`,`CUST_TYPE`,`LINE_BUS`), 
     KEY `idx1` (`RES_STATE_HSE`,`RES_CITY_HSE`,`ZIP`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1134054 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC 

请建议我,如果在索引中的任何建议为好。任何帮助表示赞赏。

+0

嗨,伙计们,请提出任何建议... – balu

回答

1

首先按日期和类型“统计不同”,然后总结这些计数?这似乎是'错误'。如果你想要一个月的'独一无二',你不能通过总结这些日子。

那2次传递数据;我认为一个就足够了。

考虑GROUP BY LEFT(LS_CHG_DTE_OCR, 7)

不要使用ORDER BY LS_CHG_DTE_OCR ASC当值不可用。相反,请使用与GROUP BY中相同的值。

如果不是DISTINCT,可以很容易地构建一个“汇总表”,使其更加高效。但是,this blog解释了“独特”如何汇总,尽管误差通常为1%。这是否够好?

+0

感谢里克詹姆斯,将实施您的建议,让我看看查询如何执行。会回到你身边。谢谢你的时间再次。干杯:) – balu