2015-11-09 50 views
1

我有一個擁有約6千萬條記錄的mysql數據庫。我將不得不每天生成報告。哪個SQL最適合使用

我有兩種類型的sql語句。

方法一

SELECT TransferStatus as Transfer_Status, count(ID) as Count 
FROM calldetails 
WHERE YEAR(IVRStartTime) = '2015' AND MONTH(IVRStartTime) = '11' AND DAy(IVRStartTime)='05' AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus; 

方法2

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

我想這兩個查詢都需要大約15分鐘,得到的結果。我的問題是哪一個最好用,還有什麼其他方式可以提高性能。

+2

提示:創建一個合適的索引。 –

+3

第一個是不可控的。因此,即使您在日期列中添加索引,它仍然會很慢。看到這個http://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable – thepirat000

+0

爲什麼關閉?這不是基於意見的,而是基於事實的。投票重新開放。 –

回答

2

使用BETWEEN最好的辦法

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE (IVRStartTime BETWEEN '2015-11-05 00.00.00' AND '2015-11-05 23.59.59') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

這個人是最好的,因爲BETWEEN執行快,比較多的where子句

或使用index始終是一個好習慣,因爲: -

數據庫indeximprovesspeed表中的操作的數據結構。可以使用一列或多列創建索引,爲快速隨機查找和對記錄的訪問提供基礎。

+0

Tnx。我創建了索引並測試了兩個sql語句。這個效果很好,大約需要2分鐘,而另一個則需要大約10分鐘才能得出結果。 –

3

只需使用DATE函數返回的日期時間值

SELECT TransferStatus as Transfer_Status, 
count(ID) as Count FROM calldetails 
WHERE DATE(IVRStartTime) = DATE('2015-11-05') 
AND CallTransfer LIKE '163%' 
GROUP BY TransferStatus 

的日期部分,這將成爲處理日期條件更有效。

您需要使用EXPLAIN來查看執行計劃是什麼,這樣就可以使用索引對其進行優化來加快查詢

+0

編號'DATE(IVRStartTime)'不是可排隊的,所以它不會在'IVRStartTime'上使用索引。 –