有這三個查詢之間的巨大差異:
a) SELECT * FROM u WHERE u.name LIKE "George%"
b) SELECT * FROM u WHERE u.name LIKE "%George"
c) SELECT * FROM u WHERE u.name LIKE "%George%"
一)第一個將採用指數u.name(如果有的話),並會非常快。
b)第二個將不能夠使用任何指數u.name但有辦法規避相當容易。
例如,您可以在存儲REVERSE(name)
的表中添加另一個字段nameReversed
。隨着該領域中的索引,查詢將被改寫爲(並會以最快的速度第一個):
b2) SELECT * FROM u WHERE u.nameReversed LIKE REVERSE("%George")
c)第三查詢帶來的最大困難是沒有前兩次的索引將會有幫助,查詢將掃描整個表格。替代方案如下:
使用專用於此類問題的解決方案(搜索「全文搜索」),如Sphinx。看到這個問題的SO更多的細節:which-is-best-search-technique-to-search-records
如果你的領域只有名稱(或另一組有限的話,說了幾百不同的話),你可以創建另一個輔助的表,這些名字(單詞)和存儲表u
中只有一個外鍵。
如果當然不是這種情況,並且您擁有數萬或數百萬個不同的單詞或者該字段包含整個短語,那麼爲了解決許多輔助表的問題,就像爲自己創建一個全文搜索工具。這是一個很好的練習,除了RDBMS之外,您不必使用Sphinx(或其他),但它不是微不足道的。
其實Facebook的剛剛超過5億活躍用戶,http://www.facebook.com/press/info.php?statistics – 2011-05-01 13:41:56
目前你使用的是哪種數據庫?我會猜測PostgreSQL是使用ilike。 – 2011-05-01 15:55:54
是的,PostgreSQL – user12384512 2011-05-01 15:58:12