在mysql中搜索字符串数组

时间:2014-03-12 07:07:30

标签: php mysql arrays

我有一个字符串数组,我需要搜索数组的字符串是否退出数据库。我正在使用以下查询:

foreach($array as $s)
{   
if(preg_match('/^(\bpho)\w+\b$/', $s))
{ 
    $query="select * from dictionary where words REGEXP '^".$s."$'";
    $result=$db->query($query) or die($db->error);
    if($result)
    {
    $count += $result->num_rows;
    }
}
}

但是这个查询需要很长时间才能执行。 PLease提供减少搜索时间的解决方案

4 个答案:

答案 0 :(得分:1)

我不认为您的问题与您的代码有关。我认为你应该优化你的数据库。 我不是很擅长但我认为你可以在你的数据库中添加索引来加速研究

答案 1 :(得分:0)

使用交替将所有搜索字符串组合成单个正则表达式。

$searches = array();
foreach ($array as $s) {
    if (preg_match('/^(\bpho)\w+\b$/', $s)) {
        $searches[] = "($s)";
    }
}
$regexp = '^(' . implode('|', $searches) . ')$';
$query="select 1 from dictionary where words REGEXP '$regexp'";
$result=$db->query($query) or die($db->error);
$count = $result->num_rows;

如果$array不包含正则表达式,则不需要使用SQL REGEXP运算符。您可以使用IN

$searches = array();
foreach ($array as $s) {
    if (preg_match('/^(\bpho)\w+\b$/', $s)) {
        $searches[] = "'$s'";
    }
}
$in_list = implode(',', $searches);
$query="select 1 from dictionary where words IN ($in_list)";
$result=$db->query($query) or die($db->error);
$count = $result->num_rows;

答案 2 :(得分:0)

搜索整个数据库是一项很大的工作,我认为更好的方法是可以缓存数据库的某些部分,而不是在缓存中搜索。 Redis非常好。

答案 3 :(得分:0)

  1. 修改您的查询,以便不选择所有表列 - 这是浪费资源。相反,只需让数据库计算包含搜索查询的行数,并仅返回一个答案(匹配):
  2. $ query =“SELECT COUNT(id)AS匹配FROM dictionary WHERE words REGEXP'^”。$ s。“$'”;

    1. 您如何索引数据库?如果您的列未正确编入索引,那么您的正则表达式将花费很长时间。检查您的数据库结构,并可能将索引添加到单词列。
    2. P.S。并且不要忘记获取匹配列,而不是使用 num_rows