如何解决大型数据库上的高性能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个字节进行快速比较以缩小字段范围?
如果您只是想找个傻瓜说...,您可能可以缩小需要比较的数量,这将是最有效的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。