在循环外创建查询

时间:2017-04-06 19:12:09

标签: php mysql optimization

我正在尝试检查字典中是否存在大句子(10k或更多单词)中的单词,但是多次执行我的查询会使我的页面变慢。如何在循环外移动查询以加快页面速度?

foreach ($word as $key => $value) {
   $checkWord = checkDict($value);
   if($checkWord==true){
     return $value;
   } else {
     $word[$key] = Del_Inflection_Suffixes($value); //skip this function
     if(checkWord($value)){
        return $value;
     }
     $word[$key] = Del_Derivation_Suffixes($value); //skip this function
     if(checkWord($value)){
        return $value;
     }
     $word[$key] = Del_Derivation_Prefix($value); //skip this function
     if(checkWord($value)){
        return $value;
     }
   }  
}

function checkDict($rootWord){ //check if the word already exist in the database
   $sql = mysql_query("SELECT * from dictionary where rootword ='$rootWord' LIMIT 1");
   $result = mysql_num_rows($sql);
   if($result==1){
     return true;
   }else{
     return false;
   }
}

1 个答案:

答案 0 :(得分:1)

您的脚本速度太慢的原因是因为通常执行数千个数据库查询会成为一个巨大的瓶颈。因此,您应该重新考虑您的逻辑。我也将假设您将放弃mysql_*函数,因为它们不应该被使用。我在回答中使用PDO。

1。选择整个表:

选择整个表格,将其放入数组并使用PHP检查该单词是否存在。

$stmt = $dbh->query("SELECT rootword from dictionary");
$dictionary = $stmt->fetchAll();

foreach ($word as $key => $value) {
    if (in_array($value, $dictionary)) {
        // word exists
    }
    else {
        // word doesn't exist
    }
}

2。使用IN

根据表的大小,上述方式也可能无法有效工作,甚至可能因内存不足而导致内存不足。因此,您可以将所有单词添加到MySQL中的IN()。请注意,还有一个limit to the amount you can pass to IN

$in  = str_repeat('?,', count($word) - 1) . '?';
$stmt = $db->prepare("SELECT rootword FROM dictionary WHERE rootword IN ($in)");
$stmt->execute($word);
$dictionary = $stmt->fetchAll();

foreach ($word as $key => $value) {
    if (in_array($value, $dictionary)) {
        // word exists
    }
    else {
        // word doesn't exist
    }
}