2011-05-26 97 views
2

我在一個MySQL表table以下數據:如何優化MySQL查詢 'SELECT * from表WHERE日期= CURDATE()和ID = 1;'

ID:INT(11)[這就是主鍵]

Date:日期

和我運行MySQL查詢:

SELECT * from table WHERE Date=CURDATE() and ID=1; 

這需要0.6至1.2秒之間秒。

有沒有什麼辦法來優化這個查詢來獲得更快的結果?

我的目標是找出我是否已經有了這個ID今天的記錄。

+0

你是說ID不是唯一的嗎?你的桌子上有主鍵嗎?要優化任何查詢,您應該在查詢的WHERE部分中使用的任何字段上編制索引。 (在這種情況下,「Date」和「ID」) – gnur 2011-05-26 09:18:57

+0

爲每個column創建索引,或爲id創建主索引。 – nunu 2011-05-26 09:19:19

+0

@gnur是的,'ID'是主鍵。 – tucson 2011-05-26 09:29:46

回答

3

IDDate上添加索引。

參見CREATE INDEX manual

+0

嘗試使用查詢添加日期索引:'ALTER TABLE table ADD UNIQUE'DATEINDEX'('Date')',但我收到錯誤「#1062 - 重複條目'2011- 04-21'鍵'DATEINDEX'「 – tucson 2011-05-26 10:48:02

+2

刪除UNIQUE關鍵字。它不應該在那裏。 – vartec 2011-05-26 11:20:09

+0

工作。非常感謝。 – tucson 2011-05-26 11:55:29

1

你可以在末尾添加一個limit 1,因爲你正在尋找一個主鍵的最大結果是1

如果你只想知道閹存不存在,你可以用ID更換*只選擇ID。

此外,如果你還沒有,你真的需要添加索引。

+0

謝謝@gnur;已經添加了限制1和選擇「ID」將其降低了50%。我也會研究索引。 – tucson 2011-05-26 09:42:56

0

SET @cur_date = CURDATE()

... WHERE日期= @cur_date ...

,然後創建日期的指標,ID(順序很重要,它應該符合你秩序查詢)。

通常,在執行查詢並將它們存儲到變量之前調用函數可讓SQL將它們視爲數字而不是函數,這可以使其使用更快的查詢算法。