2013-08-22 167 views
1

我有一個表(call_history)與一個電話呼叫報告列表,caller_id是調用者,start_date(DATETIME)是調用日期。我需要做一份報告,顯示每天有多少人第一次打電話。例如:慢SQL查詢,如何提高查詢速度?

2013-01-01 - 100 
2013-01-02 - 80 
2013-01-03 - 90 

我有這個查詢,它完美,但它非常緩慢。 start_date和caller_id列上都有索引;有沒有另外一種方法來獲取這些信息來加速這個過程?

下面是該查詢:

SELECT SUBSTR(c1.start_date,1,10), COUNT(DISTINCT caller_id) 
FROM call_history c1 
WHERE NOT EXISTS 
(SELECT id 
FROM call_history c2 
WHERE SUBSTR(c2.start_date,1,10) < SUBSTR(c1.start_date,1,10) 
    AND c2.caller_id=c1.caller_id) 
GROUP BY SUBSTR(start_date,1,10) 
ORDER BY SUBSTR(start_date,1,10) desc 

回答

4

以下「WHERE SUBSTR(c2.start_date,1,10)」是打破索引(你不應該上的左側執行功能where子句)

嘗試,而不是以下:

SELECT DATE(c1.start_date), COUNT(caller_id) 
FROM call_history c1 
    LEFT OUTER JOIN call_history c2 on c1.caller_id = c2.caller_id and c2.start_date < c1.start_date 
where c2.id is null 
GROUP BY DATE(start_date) 
ORDER BY start_date desc 

而且在重新閱讀你的問題,我覺得這是寫作的另一種方式,而無需使用NOT EXISTS

SELECT DATE(c1.start_date), COUNT(DISTINCT c1.caller_id) 
FROM call_history c1 
where start_date = 
    (select min(start_date) from call_history c2 where c2.caller_id = c1.caller_id) 
GROUP BY DATE(start_date) 
ORDER BY c1.start_date desc; 
+0

將「ORDER BY SUBSTR(start_date,1,10)」更改爲「ORDER BY start_date DESC」,使其運行速度提高2倍,其他所有操作變得更慢, – Toto

+0

第二個查詢建議實際上需要的時間比原來的一個 – Toto

+0

好的。什麼是運行這個輸出:EXPLAIN SELECT DATE(c1.start_date),COUNT(DISTINCT caller_id) FROM call_history C1 WHERE NOT EXISTS (SELECT ID FROM call_history C2 WHERE c2.start_date

2

您正在做一件奇怪的事情 - 使用WHEREGROUPORDER子句中的函數。 MySQL 將永遠不會使用函數應用於計算條件時的索引。所以,你不能用這個查詢來做任何事情,但爲了改善你的情況,你應該改變你的表格結構並將你的日期存儲爲DATE列(和單列)。然後通過這一列創建索引 - 在此之後,您將獲得更好的結果。

0

確定這裏是理想的解決方案, 速度現在0.01

SELECT first_call_date,COUNT(caller_id)AS caller_count FROM( SELECT caller_id,DATE(MIN(起始))AS first_call_date FROM call_history GROUP BY caller_id )AS CH GROUP BY first_call_date ORDER BY first_call_date DESC