2014-03-12 167 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