高性能PHP simaliraty检查大型数据库

时间:2011-05-31 22:24:12

标签: php mysql performance

我在数据库中有30,000行需要进行相似性检查(使用similar_text或其他此类函数)。

为了做到这一点,需要对每列进行30,000 ^ 2次检查。

我估计我将平均检查4列。

这意味着我将不得不进行3,600,000,000次检查。

使用PHP执行此操作的最佳(最快,最可靠)方法是什么,还要考虑请求内存限制和时间限制等?

服务器需要在执行此操作的同时仍然主动提供网页。

PS。我们使用的服务器是一个8核Xeon 32 GB RAM。

修改

每列的大小通常少于50个字符。

2 个答案:

答案 0 :(得分:1)

我猜你只需要全文搜索。

如果这不适合你,你只有一次机会解决这个问题:缓存结果。 因此,您不必为每个请求解析3bil记录

无论如何,你如何做到这一点:

   $result = array();       

   $sql = "SELECT * FROM TABLE";
   while( $row = ... ) {
      $result[] = $row;    //> Append the current record     
   }

现在结果包含表格中的所有行。

此时你说你想要similar_text()所有列彼此 要做到这一点并缓存结果,至少需要一个表(正如我在评论中所说)。

   //> Starting calculating the similarity
   foreach($result as $k=>$v) {
      foreach($result as $k2=>$v2) {

           //> At this point you have 2 rows, $v and $v2 containing your column

           $similarity = 0;

           $similartiy += levensthein($v['column1'],$v2['column1']);
           $similartiy += levensthein($v['column2'],$v2['column2']);               
           //> What ever comparison you need here between columns

           //> Now you can finally store the result by inserting in a table the $similarity
           "INSERT DELAYED INTO similarity (value) VALUES ('$similarity')"; 

      }                      
   }

你必须注意的两件事:

  • 我使用 levensthein 因为它比similar_text快得多(注意它的值与similar_text相反,因为levensthein返回的值越大,字符串之间的亲和力越小)

  • 我使用 INSERT DELAYED 来大大降低数据库成本

答案 1 :(得分:0)

oy ... similar_text()是O(n ^ 3)!

你真的需要每个比较的百分比相似性,或者你可以快速比较字符串的第一个/中间/最后X个字节来缩小字段吗?

如果你只是在寻找重复说...你可以缩小你需要做的比较次数,这将是最有效的方法。