2008-11-03 23 views
6

我想搜索一個表來查找所有行,其中一個特定字段是兩個值之一。我確切知道這些值是什麼,但我想知道哪一種是最有效的搜索方式:使用IN或文本搜索

爲了舉例,這兩個值是「xpoints」和「ypoints」。我知道一定會有其末有「點」的那場沒有其他的價值,所以我正在考慮這兩個查詢是:

WHERE `myField` IN ('xpoints', 'ypoints') 
--- or... 
WHERE `myField` LIKE '_points' 

這將使在這種情況下,最好的結果?

回答

14

與SQL查詢一樣,通過探查器運行它以查明結果。然而,我的直覺不得不說,IN搜索會更快。特別是在你給出的例子中,如果字段被索引,它只需要做2次查找。如果您執行了類似搜索,則可能需要執行掃描,因爲您正在查找以特定值結束的記錄。這也會更準確,因爲LIKE'_points'也可以返回'gpoints'或任何其他類似的字符串。

+0

當然,它將取決於表的實際大小......如果它很小,那麼優化器將簡單地選擇一個表掃描。 – 2008-11-03 03:12:45

1

除非相關列中的所有數據項都以'x'或'y'開頭,否則我相信IN始終會爲您提供更好的查詢。如果它被編入索引,就像@Kibbee指出的那樣,您只需要執行2次查找就可以同時獲得兩者。或者,如果它沒有編入索引,使用IN的表掃描將只需要檢查大部分時間的第一個字母,而使用LIKE則必須每次檢查兩個字符(假設所有項目至少有2個字符) - 因爲第一個字符被允許爲任何東西。

0

試試看看。創建大量的測試數據,並且在myfield上使用和不使用索引。當你在這裏,看看 LIKE'分'和LIKE'xpoint'之間是否有顯着差異。

這取決於優化器對每個查詢執行的操作。

對於少量數據,差異可以忽略不計。做任何一個更有意義。對於大量數據,磁盤I/O的數量遠遠超過CPU時間的數量。

我敢打賭,如果在myfield上有索引,IN會給你比LIKE更好的結果。我還打賭'xpoint_'比'_points'跑得快。但沒有什麼比自己嘗試一下。

0

MySQL在使用字符串比較(例如LIKE'%foo'或'_foo')時不能使用索引,但可以使用索引進行比較,如'foo%'和'foo_'。

因此,在你的情況下,假設該字段被索引,IN會更快。

如果你有一組有限的可能值的工作,這是值得指定域作爲一個ENUM - 那麼MySQL將在內部存儲它作爲一個整數,使這種查找速度更快,並節省磁盤空間。

0

執行IN版本比LIKE版本更快。特別是當你的通配符不在比較結束時,但即使在理想條件下,直到你的查詢接近最大查詢插入的大小,IN仍然是理想的。