php - 在 MySQL 数据库中执行 REGEXP 查找和替换的最快方法是什么?

标签 php mysql regex performance query-optimization

我有一个包含 700,000 个条目的表,我需要检查每个条目是否有 1,000,000 个单词,然后将找到的单词从 hello 替换为 #~hello~#。单词在一个条目中可能出现多次,需要全部替换。我在 PHP 中进行了尝试,预计完成代码的时间约为 362 天。我只是修改了代码以在 MySQL 中使用 LIKE,这样我就不必对照所有 700,000 个条目检查 1,000,000 个单词中的每一个,但预计完成时间仍然是 29 天。这看起来确实很高。

让事情变得更加复杂的是,单词可以是多个单词。例如,如果单词是 hello world,程序应替换为 #~hello world~#

我错过了什么?

代码看起来像这样:

$query = "SELECT word_id, word_name, FROM words ORDER BY char_length(word_name) DESC";
$result = mysqli_query($con, $query);
while($row = mysqli_fetch_array($result)){
  $words[$i] = new wordObj($row['word_id'], $row['word_name']);
}

Foreach($words as $word){
  $query = "SELECT id, entry FROM entries WHERE entry LIKE '%".$word."%'";
  $result = mysqli_query($con, $query);
  if ($result) {
    if ($result->num_rows != 0) {
      while($row = mysqli_fetch_array($result)){
        $entry[$i] = new meatObj($row['id'], $row['entry']);
        $i++;
      }
    }else{
      $entry = '';
    }
  }else{
    $entry ='';
  }
  foreach($entryArray as $entry){
    check entry for all words and replace
  }
}

最佳答案

最简单的解决方案是将所有需要替换的单词存储在哈希表中。然后,在每个条目上,我们打破所有单词并对照哈希表进行检查。

// HOW DOES TAKE 29 DAYS TO EXECUTE?
// Create a hash table to store all the words
$hash = array();

$query = "SELECT word_id, word_name, FROM words ORDER BY char_length(word_name) DESC";
$result = mysqli_query($con, $query);
while($row = mysqli_fetch_array($result)){
    $hash[strtolower($row['word_name'])] = true;
}



// DO SOME QUERY HERE
// .....

while($row = mysqli_fetch_array($result)) {
    $delimiter = "/([ \.,\"'!\?\-_;])/";
    $tokens = preg_split($delimiter, $row['entry'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

    // replace the text
    $final = "";
    foreach($tokens as $token) {
        if (isset($hash[strtolower($token)])) {
            $final .= "#~" $token . "~#";
        } else {
            $final .= $token;
        }
    }

    // UPDATE NEW ENTRY HERE
    // .......
}

关于php - 在 MySQL 数据库中执行 REGEXP 查找和替换的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33093588/

相关文章:

php - Laravel 路线,具有 1 个必需参数和可选的无限参数

javascript - Yii,通过ajax更新列表,无法理解它是如何工作的;

MySQL 计算类别中的项目数

MySQL:如何将存储过程的结果插入临时表

regex - 匹配 Google 内容类别的正则表达式

php - laravel 队列守护进程邮件停止运行并出现 SSL 错误

php - Woocommerce:如何为首次订单添加额外费用

python - 系统错误 : The connection has been disabled

python - 查找每行中最后一列匹配模式

python - 要求django url中变量的最小长度