我有一个字符串数组,我需要搜索数组的字符串是否退出数据库。我正在使用以下查询:
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 :(得分: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)
$ query =“SELECT COUNT(id)AS匹配FROM dictionary WHERE words REGEXP'^”。$ s。“$'”;
P.S。并且不要忘记获取匹配列,而不是使用 num_rows