2010-10-27 60 views
0

我有這個查詢的問題,這個查詢的複雜性不好,我長時間使用這個查詢,現在這個數據庫有很多行可以通過這個方法來選擇。所有索引都是增加的。我通過日期比較搜索其他一些方法來優化此查詢,因爲這是此解決方案的瓶頸。如何在SQL中使用更好的日期比較來優化此查詢?

SELECT (...) FROM table 
WHERE (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) >= (var_0 * 10000 + var_1 * 100 + var_2) and 
     (YEAR(row_add_date) * 10000 + 
     MONTH(row_add_date) * 100 + 
     DAYOFMONTH(row_add_date)) <= (var_3 * 10000 + var_4 * 100 + var_5) 

任何人都可以幫助我嗎? 問候

+0

相關:http://stackoverflow.com/questions/1765667/mysql-date-function-running-insanely-slow-in-left-join – 2010-10-27 14:45:35

回答

2

我建議使用內置的mysql日期比較。

row_add_date <= '20101027' and row_add_date >= '20101027' 

但是請注意,這是擺在首位一個奇怪的測試:不只是測試的日期等於10月27日,像這樣:

row_add_date = '20101027' 
+0

'0'= 0這是'0'= var_1在實踐中,我錯過了這個。 – Svisstack 2010-10-27 14:56:21

+0

感謝這個解決的問題和查詢運行速度提高了372倍。我嘗試這個,但與' - 'bettwen的價值觀,但這不工作。 – Svisstack 2010-10-27 14:56:38

2

你爲什麼要分開這樣的日期?每行功能做不是規模很好。在我看來,在結束整個日期段可以被替換爲:

where row_add_date = '2010-10-27' 

即使你想有一個範圍,你還是更好的,因爲它們使用的日期。


根據您的編輯陳述您正在使用變量,您應該在條件的右側進行計算。這是因爲在查詢開始之前,這將完成一次。用你所擁有的,左邊的計算將每行完成一次,這是一個確定的性能殺手。

+0

關閉,它可能被替換爲'row_add_date> ='2010-10-27'和row_add_date <'2010-10-28'' – Andomar 2010-10-27 14:51:44

+0

哇,你是對的:)完全錯過了。它看起來非常可怕我沒有試圖理解計算 – 2010-10-27 14:52:29

+0

我更新了問題,這個值是可變的,並且在查詢中不相等,對不起,錯過了這個。 – Svisstack 2010-10-27 14:54:15

0

我要去猜測那row_add_date的類型是datetime。如果是這樣,您需要將20101027轉換爲datetime,並將該列與該列進行比較。

換句話說:

row_add_date >= firstDateTime and row_add_date <= secondDateTime