我有一个搜索栏的查询。我知道我可以使用OR来拆分语句以检查不同的列:
$query = mysql_query('SELECT * FROM PRODUCTS WHERE cats LIKE "%'.$s.'%" OR sub_cats LIKE "%'.$s.'%"');
但是,如果我想检查两到三列以上的内容,那么这样做是加快速度的一种方法:
$query_string = explode('&&=',$_GET['q']);
$db_str = 'SELECT * FROM products WHERE name, cats, sub_cats, desc, brand ';
for($x = 0; $x < count($query_string); $x++){
$enc = mysql_real_escape_string($query_string[$x]);
if($x == (count($query_string) -1)){
$db_str .= 'LIKE "%'.$enc.'%"';
}else{
$db_str .= 'LIKE "%'.$enc.'%" ';
}
}
$query = mysql_query($db_str);
我通常在搜索栏中使用POST,但我想试试GET,它对我来说更友好
我不知道这是否会加快速度(您必须对数据进行测试)。然而,以下是只有一个比较的替代方案:
WHERE concat_ws('|', name, cats, sub_cats, desc, brand) LIKE '%$enc%'
因为like
的开头有一个通配符,所以查询不使用常规索引。所以这个版本应该不会让事情慢很多,如果有的话。
不过,解决性能问题的答案可能是全文索引。
即使忽略不推荐使用的API,您的代码也不会像那样工作。你需要做这样的事情:
$searchFields = ['name', 'cats', 'sub_cats', 'desc', 'brand'];
$searchTerm = mysql_real_escape_string($query_string[$x]);
$filters = implode(' OR ', array_map(function($field) use ($searchTerm) {
return "$field LIKE '%{$searchTerm}%'";
}, $searchFields));
$query = mysql_query('SELECT * FROM products WHERE '.$filters);
不过,它还远远不是最佳的,而且随着数据库和用户群的增长,速度会很快变慢。然而,这正是phpMyAdmin实现其数据库范围搜索的方式。如果你的数据库比几条记录还大,或者可能同时吸引多个搜索,你应该实现一个更智能的解决方案,比如全文搜索,或者实现一个外部搜索引擎,比如Apache SOLR、Amazon CloudSearch等等——像MySQL这样的关系型数据库本身并不擅长混乱的搜索,也不应该如此。
关于这句话:
我通常在搜索栏中使用POST,但我想试一试对我来说看起来更方便用户。
这不是一个很好的选择。通常:
- GET用于可重复的请求,用户可以随心所欲地对其进行F5操作
- POST是针对不可重复的请求,如果(过度)重复,通常会被认为是有害的
如果你的名字是谷歌,并且你在世界各地拥有大量服务器,请使用GET。如果您已经知道您的搜索性能不好,请坚持POST,不要诱惑狮子。