我有超过一百万行的表。 此表表示用户信息,例如userName,email,gender,marrial status等。
当应用某些条件时,我将对此表中的所有行进行搜索。
在简单的情况下,当搜索仅在userName上执行时,查找结果需要4-7秒。
select from u where u.name ilike " ... "
是的,我得到了一些文件的索引。我检查了它们是否使用了explain analyze命令。
如何提升搜索效果?
我对Lucene很感兴趣,能帮忙吗?
我想知道Facebook搜索是如何工作的,他们有数十亿用户,他们的搜索工作要快得多。
答案 0 :(得分:1)
看一看 Hibernate搜索 这是使用Lucene但更容易实现。
Google或Facebook正在使用不同的方法。他们有分布式系统。 Googles BigTable是一个很好的关键词,或者“Map and Reduce”概念(Apache Hadoop)是进行更多研究的一个很好的起点。
答案 1 :(得分:1)
尝试使用表分区。 在大型表格场景中,可以帮助分区表格。 对于PostgreSQL,请尝试PostgreSQL Partitioning。 对于高度可扩展的快速性能搜索,有时可能对采用NoSQL数据库很有用(就像Facebook一样)。
答案 2 :(得分: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%"
a)第一个将使用u.name上的索引(如果有的话)并且速度非常快。
b)第二个将无法在u.name上使用任何索引,但有很多方法可以轻易地绕过它。
例如,您可以在存储nameReversed
的表格中添加另一个字段REVERSE(name)
。使用该字段的索引,查询将被重写为(并且将与第一个一样快):
b2) SELECT * FROM u WHERE u.nameReversed LIKE REVERSE("%George")
c)第三个查询带来了最大的困难,因为前两个索引都没有任何帮助,查询将扫描整个表。替代方案是:
使用专用于此类问题的解决方案(搜索“全文搜索”),如Sphinx。有关更多详细信息,请参阅此问题:which-is-best-search-technique-to-search-records
如果您的字段只有名称(或另一组有限的单词,比如几百个不同的单词),您可以使用这些名称(单词)创建另一个辅助表,并仅在表u
中存储外键
如果情况并非如此,并且您有数万或数百万个不同的单词或该字段包含整个短语,那么要解决许多辅助表的问题,就像为自己创建一个全文搜索工具。这是一个很好的练习,除了RDBMS之外你不必使用Sphinx(或其他),但这不是一件容易的事。
答案 3 :(得分:1)
我对Lucene很感兴趣,能帮忙吗?
是的,它可以。我敢肯定,你一定会喜欢它!
我遇到了同样的问题:一张包含大约120万条消息的表。通过搜索这些消息,它需要几秒钟。 “消息”列上的全文搜索大约需要10秒钟。
在同一服务器硬件上,lucene返回大约200-400ms的结果。
那很快。
缓存结果大约在5-10毫秒内返回。
Lucene能够连接到您的SQL数据库(例如mysql) - 扫描您的数据库,构建一个可搜索的索引。
要搜索此索引,取决于应用程序的类型。 我的情况是,我的PHP Webaplication使用solr在lucene中搜索。 http://lucene.apache.org/solr/