2016-05-18 61 views
1

當在當前月份和年份中查找時間戳時,哪種性能更好?MySQL性能DATE_FORMAT()和YEAR()和MONTH()

SELECT * 
FROM mytable 
WHERE YEAR(CURRENT_TIMESTAMP) = YEAR(mytable.timestamp) 
    AND MONTH(CURRENT_TIMESTAMP) = MONTH(mytable.timestamp) 

OR

SELECT * 
FROM mytable 
WHERE DATE_FORMAT(CURRENT_TIMESTAMP,'%m-%Y') = DATE_FORMAT(mytable.timestamp,'%m-%Y') 
+0

你爲什麼不試試它的記錄嗎?我會說他們應該有類似的表現,因爲不能使用索引。 (他們不是可惜的) –

回答

3

爲了獲得更好的性能比較,並能夠在mytable.timestamp使用索引,截斷當前日期的月份。

SELECT DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-01') 

這會創建一個常數值,您可以對其進行索引搜索。

然後你就可以得到所有從這個月

SELECT * 
FROM mytable 
WHERE mytable.timestamp >= DATE_FORMAT(CURRENT_TIMESTAMP, '%Y-%m-01') 
+0

謝謝,有趣的答案。我認爲這是要走的路 – user3790083

+1

@ user3790083是的,這是好的;相反,在WHERE子句中使用列作爲函數的參數幾乎不是一個好主意,因爲這會破壞索引並且經常強制服務器評估Every的函數。單。行。這個解決方案避免了通過比較可解析爲常量表達式的東西,因爲類似NOW()類似函數在查詢開始時凍結它們的值並在查詢完成之前保持它直到查詢完成。如果你在一年的最後一天午夜之前運行這個查詢,那麼在一半的時候它不會突然出錯。 –

相關問題