[英]Slow SQL Query, how to improve this query speed?
我有一個表 (call_history) 與電話報告列表, caller_id 是來電者和 start_date (DATETIME) 是通話日期。 我需要做一份報告,顯示每天有多少人第一次打電話。 例如:
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
以下“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;
您正在做一件奇怪的事情 - 在WHERE
、 GROUP
和ORDER
子句中使用函數。 當函數用於計算條件時,MySQL永遠不會使用索引。 所以,你不能用這個查詢做任何事情,但為了改善你的情況,你應該改變你的表結構並將你的日期存儲為DATE
列(和單列)。 然后按此列創建索引 - 在此之后您將獲得更好的結果。
嘗試用左外連接替換 NOT EXISTS。
好的,這是理想的解決方案,速度現在是 0.01
SELECT first_call_date, COUNT(caller_id) AS caller_count
FROM (
SELECT caller_id, DATE(MIN(start_date)) AS first_call_date
FROM call_history
GROUP BY caller_id
) AS ch
GROUP BY first_call_date
ORDER BY first_call_date DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.