2011-10-18 65 views
0

這裏是一個需要優化查詢:如何優化包含DATE_ADD()的mysql查詢?

Scans: 527676 records... 
Returns: 496 records... 

SELECT * FROM customers c 
WHERE DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 
AND c.`custtype`='L' 

這是不使用DATE_ADD相同:

Scans: 801 records... 
Returns: 481 records... 

SELECT * FROM customers c 
WHERE c.`custdate` BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 

問題是我應該如何優化使用DATE_ADD此查詢()函數?沒有使用DATE_ADD它拿起我的索引和查詢是好的。

在此等待幫助。

感謝,

Raheel

回答

3

既然你只是增加一個固定的時間間隔c.custdate,什麼都要工作,而不是減去該時間間隔從BETWEEN值,以獲得查詢這是邏輯上等同但允許MySQL使用索引。通常,如果查詢需要評估索引值的函數,則不能使用範圍掃描。

也就是說:不是的WHERE條款是

DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59' 

使其

c.`custdate` BETWEEN '2011-09-14 05:00:00' AND '2011-09-15 04:59:59' 
+0

完全一致 - MySQL不能使用,當你有問題的領域進行功能指標,所以總是嘗試在過濾條件而不是字段上執行該功能。然後,MySQL可以使用可用的索引 –

+0

...此外,對「BETWEEN」子句中的每個值執行「DATE_ADD」函數是完全可能的,因爲MySQL會盡可能地優化那些值。例如。 「c.'custdate' BETWEEN DATE_ADD('2011-09-14 00:00:00'INTERVAL 5 HOUR)AND DATE_ADD('2011-09-14 23:59:59'INTERVAL 5 HOUR)」 –

+0

是的。 。當你建議在between子句中添加5小時以獲得類似於GMT-5的結果時,你是否知道一個方便的函數來爲日期時間添加5個小時,以便我可以使用date_add重構所有查詢。 –