簡體   English   中英

慢SQL查詢,如何提高這個查詢速度?

[英]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;

您正在做一件奇怪的事情 - 在WHEREGROUPORDER子句中使用函數。 當函數用於計算條件時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM