大型数据库上的高性能PHP小型性检查

问题描述

| 我的数据库中有30,000行需要进行相似性检查(使用
similar_text
或其他类似函数)。 为此,将需要对每列进行30,000 ^ 2检查。 我估计我将平均检查4列。 这意味着我将必须进行3,600,000,000张支票。 考虑到请求内存限制和时间限制等,用PHP做到这一点的最佳方法(最快,最可靠)是什么? 服务器需要在执行此操作的同时仍在主动为网页提供服务。 PS。我们使用的服务器是8核Xeon 32 GB内存。 编辑: 每列的大小通常小于50个字符。     

解决方法

        我想您只需要全文搜索。 如果不适合您,则只有一个机会解决此问题:缓存结果。 因此,您不必为每个请求解析30亿条记录 无论如何,您如何做到这一点:
   $result = array();       

   $sql = \"SELECT * FROM TABLE\";
   while( $row = ... ) {
      $result[] = $row;    //> Append the current record     
   }
现在结果包含表中的所有行。 此时,您说过要彼此“ 2”所有列。 要做到这一点并缓存结果,您至少需要一个表(如我在评论中所述)。
   //> 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\')\"; 

      }                      
   }
您必须注意的2件事: 我使用levensthein的原因是它比like_text快得多(请注意,它的值与same_text相反,因为levensthein返回的值越大,字符串之间的亲和力就越小) 我使用INSERT DELAYED大大降低了数据库成本     ,        oy ... similar_text()是O(n ^ 3)! 您是否真的需要每个比较的百分比相似度,或者可以只对字符串的前/中/后X个字节进行快速比较以缩小字段范围? 如果您只是想找个傻瓜说...,您可能可以缩小需要比较的数量,这将是最有效的方法。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...