php - 大型数据库的高性能 PHP 相似性检查

标签 php mysql performance

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

为此,需要对每一列进行 30,000^2 次检查。

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

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

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

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

附言。我们使用的服务器是 8 核 Xeon 32 GB 内存。

编辑:

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

最佳答案

我猜你只需要全文搜索。

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

无论如何,你可以怎么做:

   $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')"; 

      }                      
   }

2 需要注意的事项:

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

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

关于php - 大型数据库的高性能 PHP 相似性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194262/

相关文章:

mysql - 如何从值不是...的 mysql 表中进行选择?

performance - GraphViz Dot的生成时间非常长

php - 在我的 PHP 代码中找不到 'syntax error'

php - 在 Woocommerce 3 中通过 ajax 提交并创建结帐订单

php - 按时间戳日期分组不返回任何结果

mysql - 无法确定我需要表中的多条记录的 MySQL 查询

MySQL 列有空值但 "is null"不工作

performance - 映射 2 个向量 - 帮助向量化

java - 比构造函数快?

php - 将其从每月重置更改为每天重置?