时间:2011-10-22 20:16:37

标签: mysql regex performance search dns

现在我正在做PHP并且在文本文件中有1100万个域加载到一个数组中,然后我使用Regex搜索它们。要做到这一点,我需要将内存限制增加到2gig然后处理需要10秒钟。我将很快拥有1亿个域名并计划迁移到数据库解决方案,但是,在搜索1亿个域名列表时,如何获得良好的性能?

我使用正则表达式搜索:

$ domains = preg_grep(“/ store./”,$ array);

foreach($ domains as $ domain){echo $ domain;}

4 个答案:

答案 0 :(得分:3)

像lucene这样的搜索引擎怎么样: http://lucene.apache.org/java/docs/index.html

这是出于这个目的。

答案 1 :(得分:1)

正则表达式可能是搜索某些内容的最慢方式。如果您正在处理如此大量的数据,您可能会从MongoDB中受益。

答案 2 :(得分:0)

取决于“搜索”的含义。正则表达式?扫描部分字符串?数据库很有帮助 - 索引对完全部分匹配没有帮助。

用于实际匹配的OTOH(特别是如果您将域名与顶级部分分开存储)...我希望在任何体面的硬件上都有单位数ms。

正则表达式 - 更好地将文件加载到内存中并保存在那里。是的,需要2演出 - 谁在乎。 64千兆字节的服务器很便宜;)

答案 3 :(得分:0)

如果你知道域名的起源,这可能会引起人们的兴趣。您可以将文本文件分成“开头”文件。域可以以36个不同的字符开头(即a-z加0-9)。有36个不同的文件,并保持这种方式。

由于你的例子以's'开头,你可以在's'文件上运行它,并发现查询更快 - 它搜索的内容更少。

如果你总是知道搜索的前N个字符(即前面没有通配符),你可以通过将文件分成组来获得指数级更好的结果。由于后续字符可能包括hifen,因此您的文件数量不会超过36 *(37 ^(N-1)),其中N> 1。 1 ...还是很多!