清理MySQL数据的算法

时间:2015-06-18 13:54:06

标签: php mysql algorithm codeigniter

假设我在一个包含2列的表中有一个包含100,000条MySQL记录的表:标题和描述。 还有一个表格,其中包含需要消毒的所有坏词。

例如让我们说标题栏包含字符串"操这个"亵渎表说"他妈的"字符串应替换为" F ***"。

目前我用暴力方法实现它,但这太慢了。它检查句子中的每个子字符串,并将其与亵渎性过滤器中存在的每个字符串进行比较。

public function sanitizeSiteProfanity($word, $replacement)
{
    $query = $this->_ci->db->select('title, description')->get('top_sites')->result_array();
    $n = $query->num_rows();
    for($i = 0; $i < $n; $i++)
    {
        str_replace($word, $replacement, $query[$i]['title']);
        str_replace($word, $replacement, $query[$i]['description']);
    }   
}

是否有更快的方法来消毒所有子串?

3 个答案:

答案 0 :(得分:0)

优化这一点的最佳方法是将替换步骤委托给数据库,让mysql完成繁重的任务。您需要使用内置的REPLACE mysql。 (不那么大)缺点是您需要使用显式sql而不是代码点火器表达式构建器。

答案 1 :(得分:0)

我不知道是否有快速清理数据的方法。似乎你必须遍历所有替换词,因为一个标题可能有多个令人反感的词。

如果您正在寻找完整的单词,全文索引和包含应该加快速度。基本上,您将为每个单词设置一个循环,然后运行:

update table
    set title = replace(title, 'F***')
    where match (title) against ('Fuck' in boolean mode);

您需要将它放在存储过程循环中。但是,match()会非常快,这可能会显着加快当前流程。

答案 2 :(得分:0)

你试过BanBuilder吗?它保存在GitHub