2012-08-25 280 views
2

我的確有一個問題,或者對Mysql中的seraching有誤解。在mysql結果中搜索


以我表我有2個字段,第一個是ID(INT 8)和第二的used(中間體1)。

used字段只是得到0或1像布爾值。

假設行的20001人數,

ID:我最後的ID是20001和第一ID的1

used:只是我的第一個具有ID行= 1爲1,其他是0.

現在,當我想要得到一行,我寫這個代碼。沒關係。

SELECT * 
FROM `table` 
WHERE `used` =0 
LIMIT 0 , 1 

我只想在used中有一個0數量的行。 但我的問題是:我想象,Mysql搜索所有20000行,並給我一行。這會傷害我,因爲我只想要一行0數額在used 做什麼是最好的方式?

+2

我不認爲這個查詢會遍歷所有20000行。最有可能的是,它會一行一行地檢查條件,當限制完成時它會停止。當您將對未編制索引的列進行排序時,問題可能會出現。 – Zefiryn

+0

請更清晰你的問題 –

+1

@Zefiryn你確定嗎? –

回答

1
SELECT * FROM table_name WHERE used = "0"; 

會給你該使用值爲0,包含所有行:

SELECT * FROM table_name WHERE used = "0" LIMIT 1; 

會給你該使用值爲0

如果這不是你在找什麼一行因爲,你能澄清你的問題嗎?

如果你需要的最後一個記錄

SELECT * FROM table_name WHERE used = "0" ORDER BY id DESC LIMIT 1; 

編輯:

如果你擔心你的查詢速度我懷疑如果你開始了通過命令行(或工具,你你的mysql更喜歡),並運行查詢提供給一個表,只有那麼多的記錄,你會得到句子說要花多長時間,如果它絕對沒有,它可能會說(0.00秒)。 :)

如果你的表變得更爲複雜,考慮學習用mysql索引某些列:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

關於MySQL的保留字:

您的表命名引起了我的注意,你應該考慮的使用table以外的其他名稱作爲表名,因此在使用表格詞時不需要使用引號。 (你也在使用它們,字數爲used,它甚至不是保留字。

保留字的列表,應該避免在MySQL中使用(5。5):http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

+1

謝謝,但我的問題關於性能。 我想要一行,這是獲得一行的最佳SQL代碼? –

+1

@wandad是的,您的表格非常簡單,無需索引您的列。 –

+0

謝謝我的朋友。 –

2

這將返回第一個匹配項,並且搜索將在找到第一個匹配項時停止。

SELECT TOP 1 * 
FROM `table` 
WHERE `used`=0 
OR NOT (EXISTS (SELECT NULL FROM `table` WHERE `used`=0)) 
ORDER BY ASCENDING; 

2.

SELECT * 
FROM `table` 
WHERE `used`=0 
OR NOT (EXISTS (SELECT NULL FROM `table` WHERE `used`=0)) 
ORDER BY ASCENDING LIMIT 1; 

都做同樣的事情,運行測試,看看哪一個執行得更快。

+0

如果您將「限制」設置爲「1」,它將在第一場比賽後停止搜索。 @wandad –

+0

我試過了你的代碼,但查詢時間是0.0006秒,這意味着你的代碼和我的代碼是一樣的。 你同意嗎? –

+0

@ wandad側注:如果您的查詢只需要約0.0006秒,那幾乎沒有任何結果。 –