2009-11-10 118 views
1

有沒有首選的方法? game表中目前有1640行可以通過,每年將增加大約1200個。哪個mysql選擇更好/更快?

SELECT `date` FROM `game` WHERE `date`<'2009-11-09' ORDER BY `date` DESC LIMIT 1; 

0.0004秒

SELECT MAX(`date`) AS `date` FROM `game` WHERE `date`<'2009-11-09' LIMIT 1; 

0.0006秒

的速度是首次這樣跑了。每次之後每次爲0.0002。

MySQL的: 服務器
:通過UNIX套接字
Server版本本地主機:5.1.37

PHP(應該是不相關的):
5.x的

+2

LIMIT在第二個查詢中超出要求 - 將只有一個MAX()。 – 2009-11-10 00:06:54

+0

你可能會得到一個明確的答案,通過運行一個explain語句,根據文檔是: explain [select語句] 雖然性能可能會改變,當你得到更多的數據在表中。 – Mallox 2009-11-10 00:12:09

+0

@馬丁:不完全 - 可能有2+記錄具有相同的值;任何人都可以因爲「LIMIT 1」而返回。查看我的答案瞭解更多詳情。 – 2009-11-10 02:19:36

回答

2

應用的MySQL EXPLAIN並檢查查詢計劃。第二個例子可能有一個更清潔的計劃,這很好,因爲它看起來更清潔。 (一旦你刪除該限制。)

一個諾迪本地測試顯示(無索引)。

查詢1:

EXPLAIN 
SELECT datex 
FROM TABLE_X x 
WHERE datex < "2009-10-20" 
ORDER BY datex DESC 
LIMIT 1 

計劃

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  x  ALL NULL   NULL NULL NULL 2 Using where; Using filesort 

問題2:

EXPLAIN 
SELECT MAX(datex) 
FROM TABLE_X x 
WHERE datex < "2009-10-20" 

計劃

id select_type table type possible_keys key  key_len ref rows Extra 
1 SIMPLE  x  ALL NULL   NULL NULL NULL 2 Using where 
+0

解釋不會告訴你它將運行多快。 – jle 2009-11-10 00:42:33

+2

@jle:解釋計劃會告訴您查詢的效率如何。更好的效率,更好的表現... – 2009-11-10 01:58:49

1

隨着行的這些數字和查詢的簡單性,這應該不重要。您也不需要第二個查詢的限制。只要選擇哪一個更容易理解。

+0

同意 - 除非每秒4千萬秒和6萬萬秒之間的差異對您的應用程序來說是重要的;-) – 2009-11-10 00:10:24

+0

我確實意識到這是一個小型數據庫,但我希望學習最佳實踐所以如果它應該是一個大型的數據庫... – MECU 2009-11-10 00:12:38

+0

最好的做法是很少猜測查詢優化器,這是我認爲第一個查詢是,即使你可能是正確的,這次。最好的做法是更多地寫出你的意思,以便稍後有人讀到它時,沒有'呃'?因子。我的投票是查詢2. – Don 2009-11-10 05:18:39

1

在第二個查詢你不必添加LIMIT 1。它將始終返回1行。我會說第二個查詢更具可讀性,你應該使用。但我同意@jle。你有非常小的數據庫,它確實不會影響性能。

0

你可以看一下的計劃是什麼(即MySQL的是如何做的工作)使用說明 - http://dev.mysql.com/doc/refman/5.0/en/explain.html

我想他們是幾乎相同的,但是這是檢查(這可能取決於索引等)的最佳方法。

但我要問 - 你真的需要擔心這個?這並不是很慢,桌子也沒有以巨大的速度增長。

最後,你不需要第二個「限制」。

0

我也想加入到其他所有的迴應:

嘗試添加一百萬條記錄。最好的方式來確定。