2011-05-01 46 views
0

我得到了超过100万行的表。 此表代表用户信息,例如用户名,电子邮件地址,性别,婚姻状况等。在巨大的表格搜索

我将在应用某些条件时在此表中的所有行上编写搜索。

在简单情况下,仅在userName上执行搜索时,需要4-7秒才能找到结果。

select from u where u.name ilike " ... " 

是的,我得到了一些fileds索引。我检查了他们是使用解释分析命令应用的。

如何搜索可以提高?

我对Lucene有一些想法,能帮忙吗?

我想知道Facebook的搜索工作如何,他们得到了数十亿用户,他们的搜索工作更快。

+0

其实Facebook的刚刚超过5亿活跃用户,http://www.facebook.com/press/info.php?statistics – 2011-05-01 13:41:56

+0

目前你使用的是哪种数据库?我会猜测PostgreSQL是使用ilike。 – 2011-05-01 15:55:54

+0

是的,PostgreSQL – user12384512 2011-05-01 15:58:12

回答

1

有这三个查询之间的巨大差异:

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(或其他),但它不是微不足道的。

+0

这实际上并不正确,在ILIKE中选择与前面的%可以使用索引,我在文档中读取并测试自己。至少在Postgres。无论如何,我接受你的答案,因为它是最庞大的。在这种情况下,使用Lucene或Sphinx可能是最好的解决方案。 – user12384512 2011-05-02 09:46:48

+0

我不知道(ILIKE中的*之前的%可以使用索引*)。你能提供关于Postgres这种行为的文档参考吗? – 2011-05-02 10:32:22

+0

对不起,你完全正确。只是检查文件,甚至不知道为什么我想的是相反的。 – user12384512 2011-05-02 13:57:00

1

看看 Hibernate Search的 这是使用Lucene但很多更容易实现。

谷歌或Facebook正在使用不同的方法。他们有分布式系统。谷歌BigTable是一个很好的关键词,或者“Map and Reduce”概念(Apache Hadoop)是进行更多研究的一个很好的起点。

+0

据我所知地图减少不适合在线搜索。 Hadopp用于大型数据集分析,地图缩减作业需要太多时间,并且作为后台任务 – user12384512 2011-05-01 13:46:42

+0

需要索引太多,而不仅仅是搜索。而对于分布式系统,您需要一个良好的基础,那就是hadoop正在做的事情。但是,我确定这个问题超出了原始问题的范围,因此我刚刚提到了它,因为谷歌和其他大公司都有“其他”方法,这些方法在一天内不是一个简单的解决方案。 – Omnaest 2011-05-02 14:58:17

1

尝试使用表分区。 在大表格场景中可能有助于分区表格。 对于PostgreSQL在这里尝试PostgreSQL Partitioning。 对于高扩展性的快速性能搜索,有时可能会采用NoSQL数据库(如Facebook)。

1

我对Lucene的一些想法有帮助吗?

是的,它可以。我相信,你会爱上它!

我有同样的问题:一个表大约有120万条消息。通过搜索这些消息它需要几秒钟。 “消息”列上的全文搜索需要大约10秒。

在相同的服务器硬件lucene返回约200-400ms的结果。

速度非常快。

缓存结果大概在5-10毫秒左右返回。

Lucene能够连接到你的SQL数据库(例如mysql) - 扫描你的数据库并构建一个可搜索的索引。

要搜索此索引,它取决于应用程序的种类。 我的情况是,我的PHP Webaplication使用solr在lucene中搜索。 http://lucene.apache.org/solr/