我有一個表包含今天5m記錄。到這個數據將增加到1或20億記錄。我的任務是從這些數據中生成一個總結報告,爲此我正在使用下面的查詢。Sql查詢花費太多的時間與組通過
SELECT creation_date
,caller_circle
,count(id)
FROM call_reporting
WHERE enterprise_id = 206
GROUP BY DATE (creation_date)
,caller_circle limit 10;
表結構看起來像這樣。
CREATE TABLE `call_reporting` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`SESSION_ID` varchar(255) DEFAULT NULL,
`CALLER_NUMBER` bigint(20) NOT NULL,
`DIALED_NUMBER` bigint(20) NOT NULL,
`CALL_START_TIME` datetime DEFAULT NULL,
`CALL_END_TIME` datetime DEFAULT NULL,
`OUT_CALL_START_TIME` datetime DEFAULT NULL,
`OUT_CALL_END_TIME` datetime DEFAULT NULL,
`HUNTING_START_TIME` datetime DEFAULT NULL,
`IN_CALL_DURATION` bigint(20) DEFAULT NULL,
`OUT_CALL_DURATION` bigint(20) DEFAULT NULL,
`HUNTING_DURATION` bigint(20) DEFAULT NULL,
`ADV_ID` bigint(20) DEFAULT NULL,
`ENTERPRISE_ID` bigint(20) DEFAULT NULL,
`AGENT_ID` bigint(20) DEFAULT NULL,
`HUNT_TRY` int(255) DEFAULT NULL,
`CAMPAIGN_ID` bigint(20) DEFAULT NULL,
`CALL_STATUS` varchar(255) DEFAULT NULL,
`URL_CALLING_STATUS` varchar(255) DEFAULT NULL,
`REMARKS` text,
`REF_NO` varchar(255) DEFAULT NULL,
`POST_CALL_RESULT` bit(1) DEFAULT NULL,
`CREATION_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`AGENT_DIAL_OUT_NUMBER` bigint(20) DEFAULT NULL,
`DATA_SYNC` bit(1) DEFAULT NULL,
`CALLER_CIRCLE` varchar(50) DEFAULT NULL,
`STATUS_CODE` varchar(50) DEFAULT NULL,
`OPERATOR_NAME` varchar(50) DEFAULT NULL,
`OBD_RESULT_STATUS` bit(1) DEFAULT NULL,
`MAIL_SENT` bit(1) DEFAULT NULL,
`SDR_ID` varchar(255) DEFAULT NULL,
`KEY_PRESS` varchar(1024) DEFAULT NULL,
`ENTERPRISE_USER_ID` bigint(20) DEFAULT NULL,
`CAMAIGN_NAME` varchar(128) DEFAULT NULL,
`DND_NO` bit(1) DEFAULT b'0',
KEY `ID` (`ID`),
KEY `ENTERPRISE_ID` (`ENTERPRISE_ID`),
KEY `SDR_ID` (`SDR_ID`),
KEY `CALLER_NUMBER` (`CALLER_NUMBER`),
KEY `CREATION_DATE` (`CREATION_DATE`),
KEY `DIALED_NUMBER` (`DIALED_NUMBER`),
KEY `CALLER_CIRCLE` (`CALLER_CIRCLE`),
KEY `CAMAIGN_NAME` (`CAMAIGN_NAME`),
KEY `ADV_ID` (`ADV_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2612658 DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH (MONTH(CREATION_DATE))
PARTITIONS 12 */ |
此表還包含分區。但是當我運行給定的查詢需要
10 rows in set (15.11 sec)
當我看到了查詢配置文件它提供了以下統計。
+--------------------------------+-----------+
| Status | Duration |
+--------------------------------+-----------+
| starting | 0.000052 |
| Waiting for query cache lock | 0.000017 |
| checking query cache for query | 0.000106 |
| checking permissions | 0.000023 |
| Opening tables | 0.000051 |
| System lock | 0.000035 |
| Waiting for query cache lock | 0.000015 |
| init | 0.000085 |
| optimizing | 0.000036 |
| statistics | 0.003924 |
| preparing | 0.000075 |
| Creating tmp table | 0.000077 |
| executing | 0.000014 |
| Copying to tmp table | 16.945653 |
| Sorting result | 0.000879 |
| Sending data | 0.001254 |
| end | 0.000012 |
| removing tmp table | 0.000017 |
| end | 0.000010 |
| query end | 0.000013 |
| closing tables | 0.000019 |
| freeing items | 0.000030 |
| logging slow query | 0.000008 |
| logging slow query | 0.000008 |
| cleaning up | 0.000007 |
+--------------------------------+-----------+
25 rows in set (0.01 sec)
將數據複製到臨時表中需要花費大量的時間;有什麼辦法可以縮短執行時間嗎?在我的情況下,臨時表大小是
tmp_table_size | 16777216 |
我也在考慮將數據加載到RAM中。但不要它的優點和缺點。因爲在我的情況下,數據量將會擴大。請給出一個方法來做到這一點。
在此先感謝。
你在這張桌子上有什麼樣的索引? – 2014-12-04 17:08:26
索引類型BTree,Column-ID,Enterprise_Id,Sdr_id,caller_number,Dialed_number,cAller_circle,Campaing_Name,Av_id – 2014-12-04 17:16:52
基數爲,2602135,24,650533,2602135,236557,24,24,24按照上述列順序 – 2014-12-04 17:19:02