2011-03-10 58 views
2

嘿,夥計們,我正在做一個需要很多查詢的社交網站。我正在使用1個查詢中有一個IN()函數。我想知道這是否需要完整的數據庫掃描。我不確定任何其他方式獲得相同的結果。MySQL - IN()函數是否需要完整的TABLE掃描?

示例表:

ID | NAME | AGE 
05 | Quinton | 25 
22 | Stevey | 33 
78 | Rebecca | 22 
90 | Michael | 26 

Query: "SELECT * FROM users WHERE id IN(05,78) ORDER BY id DESC LIMIT 0,2" 

這是最有效的方式來獲取是一個數組中的用戶列表? (使用PHP)

+0

'全DB'掃描或'全Table'掃描 – diEcho 2011-03-10 06:34:16

+0

表掃描對不起 – 2011-03-10 06:35:44

回答

4

一般而言,IN不需要表掃描。如果您有id列的索引,MySQL將能夠使用該索引。但是當您的表中只有4行時,執行表掃描通常是最快的,所以當測試少量數據時,您可能會發現在插入更多數據之前索引沒有被使用。

+0

笑感謝,該表將在千100的。並且正在尋找的列被索引。那麼爲了澄清這是最有效的方法? – 2011-03-10 06:34:08

+0

@qrpike:是的,應該沒問題。如果您想確定,請嘗試運行'EXPLAIN SELECT ...'並檢查實際使用的密鑰(如果有的話)。 – 2011-03-10 06:36:27

+0

他在哪裏錯過報價?因爲我拼命想弄清楚哪裏找不到這個地方! – 2011-03-10 06:37:08

2

如果您在ID字段中有一個索引,它不應該需要數據庫掃描。我假設ID字段是主鍵,這意味着它默認被索引。

+0

我的意思是桌面掃描很抱歉。表中有大約100k行,並且該列被索引。 – 2011-03-10 06:36:37

0

首先有錯誤的查詢,它應該是

"SELECT * FROM users WHERE id IN(05,78) ORDER BY id DESC LIMIT 0,2" 

第二件事,UR使用limit 0,2時,那麼爲什麼ü掃描整個表,U可以搜索這樣

WHERE id=05 OR id=78 ORDER BY RAND() LIMIT 2

+0

這只是一個示例查詢,而不是網站中的一個。 – 2011-03-10 06:47:06

+0

和順便說一句,查詢不需要圍繞值。 – 2011-03-10 06:47:53

2

您可以檢查是否有額外的WHERE聲明加快速度。當從右向左評估時,對最低/最高ID的限制可能是有益的,例如,

SELECT * FROM users WHERE id in(13,18,3456) AND id >= 13 AND id <= 3456 

(假設列id索引)

+0

我一定會那樣做的! Thansks! – 2011-03-10 06:50:13