有这三个查询之间的巨大差异:
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