2014-03-12 168 views
1

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

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提供了一个解决方案,以缩短搜索时间

+0

的,如果你可以缩小搜索范围,特定的表或列,那么你可以你为什么要使用'REGEXP'时使用的指标在那个特定的列 –

+0

它看起来像你在做精确匹配? '$ array'是否包含正则表达式? – Barmar

+0

是的,你可以看到我正在搜索所有以'pho'开头的元素。 – user3409204

回答

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; 
1

我不认为你的问题在这里是关于你的代码。我认为你应该优化你的数据库。 我不是很擅长,但我认为你可以在你的数据库添加索引,以加快研究

+0

索引只具有优化REGEXP匹配的能力有限。 – Barmar

+0

而这正是他不需要的东西? – Tynamo

+0

也许你应该更具体。你推荐什么类型的优化来使正则表达式匹配更快? – Barmar

0

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

0
  1. 修改您的查询,以便不选择所有表列 - 这是浪费资源。相反,只要让数据库计算包含搜索查询的行数并返回仅一个答案(匹配):

$ query =“SELECT COUNT(id)AS与FROM词典匹配WHERE words REGEXP'^ ”。$ S。 “$'”;

  1. 如何为数据库编制索引?如果您的单词列没有正确编制索引,那么您的正则表达式需要很长时间。检查您的数据库结构并可能将索引添加到单词列。

P.S.而且不要忘了取比赛列,而不是使用NUM_ROWS