我有一个包含 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/