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注入的潜力。