2010-07-19 120 views
7

我有一個查詢可以用相同的結果表達2種不同的方式。哪一個更好 - 出於業績或其他原因?哪個mySQL日期查詢性能更好?

首先查詢:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01 00:00:00' AND '2010-12-31 23:59:59' 

第二個查詢:

SELECT post_id FROM posts 
    WHERE YEAR(post_date)=2010 

在此先感謝。


經過基準測試的建議後,我進行了一些搜索和測試。我的測試不是基準測試,因爲我的電腦出現了一些問題,但他們給了我一些想法。

我已經測試了我的4000 rowed table,並沒有一個重要的區別。 BETWEEN命令在總查詢時間爲0.09時比YEAR(post_date)多了0.01-0.02秒。看起來使用YEAR(post_date)對於性能和可用性都會有好處。

我瞭解到,雖然搜索;如果數小時或數分鐘並不那麼重要,BETWEEN可以使用這樣的:

SELECT post_id FROM posts 
    WHERE post_date BETWEEN '2010-01-01' AND '2010-12-31' 
+6

你爲什麼不自己評測一下? – dbemerlin 2010-07-19 12:41:49

+0

注意:'BETWEEN'2010-01-01'AND'2010-12-31''確實有點*令人驚訝:不包括最後一天,因爲它內部擴展爲'BETWEEN'2010-01-01 00 :00:00'AND'2010-12-31 00:00:00'' – Piskvor 2010-11-19 19:22:36

+1

@dbemerlin:因爲其他人(像我)可以來看看其他人的答案和結果。 – 2011-02-02 15:58:33

回答

8

如果你有一個post_date(如果你想經常運行這個查詢,我會推薦)索引,然後BETWEEN查詢can use it。一旦你將一列寫入一個函數(YEAR(post_date)),MySQL不再使用該列的索引,因此它必須遍歷所有行(這就是所謂的full table scan)。

檢查輸出EXPLAIN SELECT與您的查詢(check this tutorial),看看你會得到什麼結果 - 如果有一個可用的指數,你應該看清楚差異。

當然,您需要對您的代碼進行基準測試並親自查看 - 但通常情況下,在WHERE中使用函數較慢。

+0

感謝Piskvor。我有一些搜索和編輯我的問題。供參考 – Kemal 2010-07-19 15:20:12

+0

不客氣。在4000行,差異確實無關緊要。 – Piskvor 2010-07-19 15:37:48

0

我與其他海報同意 - 只是嘗試一下,因爲你有兩個查詢可用。沒有比這更好的測試了。

如果我不得不猜測(這總是一個糟糕的主意!),它會更快,那麼我會說,如果post_date被索引,那麼第一個會更快,因爲它可以使用索引來檢索匹配的行。如果沒有指數,那麼兩者之間的任何差異都是微不足道的。

+0

感謝您回覆mdma – Kemal 2010-07-19 15:21:32

1

正如其他人所說,你可以自己衡量相對的表現。

SELECT post_id FROM posts WHERE YEAR(post_date)=2010 

是比其他更可讀性,除非性能是一個問題,我會一直這樣做。

+1

好點 - 它是可讀的,但縮放它不會;以上幾千行,性能問題你可能有;) – Piskvor 2010-07-19 13:08:23

+0

我想我也會選擇這個^ _ ^ – Kemal 2010-07-19 15:20:53