PHP-MySQL查询优化

PHP-MySQL查询优化,php,mysql,search,Php,Mysql,Search,我只是想知道是否有最好的方法来做这个查询 $searchTerm = explode(' ', $search); $wall_sql = "SELECT filename, category, name, downloads FROM wallpapers WHERE (pending='0' AND mediaType='0') AND ( "; for($i=0;$i<count($searchTerm);$i++){ if($i != 0){ $wall_s

我只是想知道是否有最好的方法来做这个查询

$searchTerm = explode(' ', $search);
$wall_sql = "SELECT filename, category, name, downloads FROM wallpapers WHERE (pending='0' AND mediaType='0') AND ( ";
for($i=0;$i<count($searchTerm);$i++){
    if($i != 0){
        $wall_sql .= " OR ";    
    }
    $wall_sql .= " (category LIKE '%".$searchTerm[$i]."%') OR (filename LIKE '%".$searchTerm[$i]."%') OR (tags LIKE '%".$searchTerm[$i]."%') OR (name LIKE '%".$searchTerm[$i]."%') ";        
}
$wall_sql .= " ) ORDER BY ordernum DESC ";
$searchTerm=explode(“”,$search);
$wall_sql=“选择文件名、类别、名称、从墙纸下载,其中(pending='0'和mediaType='0')和(“;

对于($i=0;$i您的查询将无法使用任何索引,而使用LIKE可能会给出错误的匹配(例如,搜索
x,如“%red%”
将匹配
hired


如果您还没有考虑过这一点,您可能希望查看一个,因为这种类型的搜索可以使用
全文
索引。

您给出的查询是一个普通的搜索查询,这可能很好。如果您想提高性能,您可以添加全文索引并使用全文搜索或使用.Sphinx之类的工具对数据库进行索引因此全文搜索变得非常快。但是,您需要安装和维护它。

我将根据搜索条件,在连接表列时创建几个虚拟表

差不多

SELECT w.filename, 
       w.category, 
       w.name, 
       w.downloads 
FROM   wallpapers w 
       LEFT JOIN (SELECT 'term1' AS name 
             UNION 
             SELECT 'term2' AS name 
             UNION 
             SELECT 'term3' AS name)  cat 
         ON cat.name = w.category 
       LEFT JOIN (SELECT 'filename1' AS name 
             UNION 
             SELECT 'filename2' AS name 
             UNION 
             SELECT 'filename3' AS name)  f 
         ON f.name = w.filename 
WHERE  w.pending = '0' 
         AND w.mediatype = '0' 
         AND (cat.name IS NOT NULL OR f.name IS NOT NULL)
GROUP by w.id
ORDER  BY w.ordernum DESC 
在这种情况下,您将动态地将虚拟表值构造为静态硬编码值(term1,2,3和filename1,2,3),并且需要在以下列上添加索引

  • (挂起,mediatype)
  • (ordernum)
  • (类别)
  • (文件名)
  • 假设您有主键
    id

  • 从你描述任务的方式来看,你做得很好。 但是,如果您使用类似“%search\u term%”的方法,索引将不在窗口中

    可以稍微重构代码以提高可读性:

    $searchTerm = explode(' ', $search);
    foreach ($searchTerm as $s){
        $f[] = "category LIKE '%".$s."%'";
        $f[] = "filename LIKE '%".$s."%'";
        $f[] = "tags LIKE '%".$s."%'";
        $f[] = "name LIKE '%".$s."%'"; 
    } 
    $wall_sql = " 
    SELECT filename, category, name, downloads   
      FROM wallpapers   
      WHERE pending='0' AND mediaType='0'
        AND (".implode(" OR ",$f).")   
    ORDER BY ordernum DESC";
    

    仅供参考:您的代码具有SQL注入的潜力。