2016-06-01 149 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