大型数据库上的高性能PHP模拟校验

大型数据库上的高性能PHP模拟校验,php,mysql,performance,Php,Mysql,Performance,我的数据库中有30000行需要进行相似性检查(使用similor\u text或其他类似功能) 为此,需要对每列进行30000^2次检查 我估计我将检查平均4列 这意味着我将不得不做3600000000检查 记住请求内存限制和时间限制等,用PHP实现这一点的最佳(最快、最可靠)方法是什么 服务器仍需要在执行此操作的同时主动为网页提供服务 另外,我们使用的服务器是一个8核Xeon 32 GB ram 编辑: 每列的大小通常小于50个字符。我想您只需要进行全文搜索 如果这不适合你,你只有一个机会来解

我的数据库中有30000行需要进行相似性检查(使用
similor\u text
或其他类似功能)

为此,需要对每列进行30000^2次检查

我估计我将检查平均4列

这意味着我将不得不做3600000000检查

记住请求内存限制和时间限制等,用PHP实现这一点的最佳(最快、最可靠)方法是什么

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

另外,我们使用的服务器是一个8核Xeon 32 GB ram

编辑:


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

我想您只需要进行全文搜索

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

不管怎么说,这里是你可以做到的:

   $result = array();       

   $sql = "SELECT * FROM TABLE";
   while( $row = ... ) {
      $result[] = $row;    //> Append the current record     
   }
现在,结果包含表中的所有行

此时,您说希望所有列彼此
相似的\u text()

要做到这一点并缓存结果,您至少需要一个表(正如我在评论中所说的)

您必须注意的两件事:

  • 我使用了levenstein,因为它比相似的\u文本快得多(注意它的值,它与相似的\u文本相反,因为levenstein的值越大,字符串之间的关联性越小)

  • 我使用了插入延迟来大大降低数据库成本


我想你只需要全文搜索

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

不管怎么说,这里是你可以做到的:

   $result = array();       

   $sql = "SELECT * FROM TABLE";
   while( $row = ... ) {
      $result[] = $row;    //> Append the current record     
   }
现在,结果包含表中的所有行

此时,您说希望所有列彼此
相似的\u text()

要做到这一点并缓存结果,您至少需要一个表(正如我在评论中所说的)

您必须注意的两件事:

  • 我使用了levenstein,因为它比相似的\u文本快得多(注意它的值,它与相似的\u文本相反,因为levenstein的值越大,字符串之间的关联性越小)

  • 我使用了插入延迟来大大降低数据库成本

oy。。。类似的文本()是O(n^3)

您真的需要为每次比较提供一个百分比的相似性吗?还是可以对字符串的第一个/中间/最后一个X字节进行快速比较以缩小字段范围

如果你只是在找傻瓜,说。。。你可以缩小你需要做的比较的范围,这将是最有效的策略。。。类似的文本()是O(n^3)

您真的需要为每次比较提供一个百分比的相似性吗?还是可以对字符串的第一个/中间/最后一个X字节进行快速比较以缩小字段范围


如果你只是在找傻瓜,说。。。您可能可以缩小需要进行的比较的数量,这将是最有效的方法。

我不是真的在搜索,我需要查看一列数据是否与任何其他行或列数据的相似性超过90%。您需要将每列数据与所有其他列数据进行比较吗?或者,您只有一列一行的字符串需要与其他行进行比较?每行的列与另一行的列相对。@petah:这是一项您只需执行一次并将结果保存到某个位置的任务,还是需要更频繁地执行此任务?@yes123,不时执行一次。缓存肯定会发挥作用。我不是真的在搜索,我需要看看是否有一列数据与任何其他行或列数据的相似性超过90%。是否需要将每一列与所有其他列进行比较?或者,您只有一列一行的字符串需要与其他行进行比较?每行的列与另一行的列相对。@petah:这是一项您只需执行一次并将结果保存到某个位置的任务,还是需要更频繁地执行此任务?@yes123,不时执行一次。缓存肯定会发挥作用。