搜索所有php加载非常慢?

搜索所有php加载非常慢?,php,mysql,Php,Mysql,我的网站是前一段时间建立的,我对php不太了解,但是当我进入search Criteria,即苏格兰的医疗销售工作时,搜索结果加载非常快,但是当我点击search时,所有结果页面加载非常慢,有时甚至不加载。这是它的直接链接: 我不知道该复制php的哪一部分,所以这就是我发送链接的原因,但是如果我能提供更多信息,请务必让我知道。 非常感谢 ** 更新:感谢dwurf,代码如下: //echo $sql; $res=$_Db->execute($sql); $total = $_Db->

我的网站是前一段时间建立的,我对php不太了解,但是当我进入search Criteria,即苏格兰的医疗销售工作时,搜索结果加载非常快,但是当我点击search时,所有结果页面加载非常慢,有时甚至不加载。这是它的直接链接: 我不知道该复制php的哪一部分,所以这就是我发送链接的原因,但是如果我能提供更多信息,请务必让我知道。 非常感谢

**

更新:感谢dwurf,代码如下:

//echo $sql;
$res=$_Db->execute($sql);
$total = $_Db->numResults($res);

$displaylimit = $limit;

if ($total<$displaylimit+$start)
    $displaylimit=$total-$start;

$sql .= " LIMIT ".$start.", ".$limit;
//echo $sql;
$res=$_Db->execute($sql);

if($_Db->numResults($res)>0) {

    $co = 0;
    while($row=$_Db->fetchAssoc($res)) {    

        $jobs[$co]["id"]=$row[JOB_TABLE."_id"];
        $jobs[$co]["title"]=$row[JOB_TABLE."_title"];
        $jobs[$co]["product"]=getCatLocSecTitle($_Db, PDT_TABLE, $row[PDT_TABLE."_id"]);
        $jobs[$co]["salary"]=getCatLocSecTitle($_Db, SAL_TABLE, $row[SAL_TABLE."_id"]);

        $co++;

    }
}
//echo$sql;
$res=$\u Db->execute($sql);
$total=$\u Db->numResults($res);
$displaylimit=$limit;
if($totalexecute($sql);
如果($\u Db->numResults($res)>0){
$co=0;
而($row=$\u Db->fetchAssoc($res)){
$jobs[$co][“id”]=$row[JOB_TABLE.\u id”];
$jobs[$co][“title”]=$row[JOB_TABLE.\u title];
$jobs[$co][“product”]=getCatLocSecTitle($\u Db,PDT\u TABLE,$row[PDT\u TABLE.\u id“]);
$jobs[$co][“salary”]=getCatLocSecTitle($\u Db,SAL\u TABLE,$row[SAL\u TABLE.\u id“]);
$co++;
}
}
Woah

问题是你的查询是垃圾。数据库设计可能也需要一些工作。我认为PHP没有任何问题(除了过度的字符串操作),但我们只能看到一点点

让我们整理一下您的SQL语句,让我们欣赏它的辉煌:

$sql = 
"SELECT * FROM ".JOB_TABLE." 
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND (".CAT_TABLE."_id IN 
    (SELECT ".CAT_TABLE."_id FROM ".CAT_TABLE." WHERE ".CAT_TABLE."_display='1' ".$conds_cat.") 
AND ".LOC_TABLE."_id IN 
    (SELECT ".LOC_TABLE."_id FROM ".LOC_TABLE." WHERE ".LOC_TABLE."_display='1' ".$conds_loc.")) 
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC";
性能问题的根源很简单。如果未设置类别或位置,查询将检索作业表中每个作业的所有类别/位置的完整列表。我们说它以O(m*n)进行缩放,这是错误的

提高性能的一个简单方法是在未设置位置/类别时完全删除该子句 还可以直接连接到这些表,并检查类别是否应显示在where子句中

$conds_cat = "";
$conds_loc = "";
$conds_sec = "";
$conds_sal = "";

if (isset($i["start"]) && $i["start"] > 0)
    $start = $i["start"];

if (isset($i["limit"]) && $i["limit"] > 0)
    $limit = $i["limit"];

$conds_cat = '';
$conds_loc = '';
if(isset($i["category"]) && $i["category"] != "")
    $conds_cat = " AND ".CAT_TABLE.".".CAT_TABLE."_id ='".$i["category"]."'"; 
if(isset($i["location"]) && $i["location"] != "")
    $conds_loc = " AND ".LOC_TABLE.".".LOC_TABLE."_id ='".$i["location"]."'"; 

$searchstring = "&category=".$i["category"]."&location=".$i["location"]."&limit=".$i["limit"];

$sql = 
"SELECT 
    ".JOB_TABLE.".*,
    ".JBC_TABLE.".*, 
    ".JBL_TABLE.".*, 
    ".JBS_TABLE.".*, 
    ".JBP_TABLE.".* 
FROM 
    ".CAT_TABLE.",
    ".LOC_TABLE.",
    ".JOB_TABLE."
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND ".JOB_TABLE.".".CAT_TABLE."_id = ".CAT_TABLE.".".CAT_TABLE."_id
AND ".JOB_TABLE.".".LOC_TABLE."_id = ".LOC_TABLE.".".LOC_TABLE."_id
AND ".CAT_TABLE."_display = '1' 
AND ".LOC_TABLE."_display = '1' 
$conds_cat 
$conds_loc
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC";
更新:修复了两个可能导致PHP错误或错误SQL结果的错误。 更新2:修复了类别/位置过滤器中的错误

问题是你的查询是垃圾。数据库设计可能也需要一些工作。我认为PHP没有任何问题(除了过度的字符串操作),但我们只能看到一点点

让我们整理一下您的SQL语句,让我们欣赏它的辉煌:

$sql = 
"SELECT * FROM ".JOB_TABLE." 
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND (".CAT_TABLE."_id IN 
    (SELECT ".CAT_TABLE."_id FROM ".CAT_TABLE." WHERE ".CAT_TABLE."_display='1' ".$conds_cat.") 
AND ".LOC_TABLE."_id IN 
    (SELECT ".LOC_TABLE."_id FROM ".LOC_TABLE." WHERE ".LOC_TABLE."_display='1' ".$conds_loc.")) 
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC";
性能问题的根源很简单。如果未设置类别或位置,查询将检索作业表中每个作业的所有类别/位置的完整列表。我们说它以O(m*n)进行缩放,这是错误的

提高性能的一个简单方法是在未设置位置/类别时完全删除该子句 还可以直接连接到这些表,并检查类别是否应显示在where子句中

$conds_cat = "";
$conds_loc = "";
$conds_sec = "";
$conds_sal = "";

if (isset($i["start"]) && $i["start"] > 0)
    $start = $i["start"];

if (isset($i["limit"]) && $i["limit"] > 0)
    $limit = $i["limit"];

$conds_cat = '';
$conds_loc = '';
if(isset($i["category"]) && $i["category"] != "")
    $conds_cat = " AND ".CAT_TABLE.".".CAT_TABLE."_id ='".$i["category"]."'"; 
if(isset($i["location"]) && $i["location"] != "")
    $conds_loc = " AND ".LOC_TABLE.".".LOC_TABLE."_id ='".$i["location"]."'"; 

$searchstring = "&category=".$i["category"]."&location=".$i["location"]."&limit=".$i["limit"];

$sql = 
"SELECT 
    ".JOB_TABLE.".*,
    ".JBC_TABLE.".*, 
    ".JBL_TABLE.".*, 
    ".JBS_TABLE.".*, 
    ".JBP_TABLE.".* 
FROM 
    ".CAT_TABLE.",
    ".LOC_TABLE.",
    ".JOB_TABLE."
LEFT JOIN (
    ".JBC_TABLE.", 
    ".JBL_TABLE.", 
    ".JBS_TABLE.", 
    ".JBP_TABLE.") 
ON (
    ".JBC_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBL_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBS_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id 
    AND ".JBP_TABLE.".".JOB_TABLE."_id=".JOB_TABLE.".".JOB_TABLE."_id) 
WHERE 
    ".JOB_TABLE."_display = '1' 
AND ".JOB_TABLE.".".CAT_TABLE."_id = ".CAT_TABLE.".".CAT_TABLE."_id
AND ".JOB_TABLE.".".LOC_TABLE."_id = ".LOC_TABLE.".".LOC_TABLE."_id
AND ".CAT_TABLE."_display = '1' 
AND ".LOC_TABLE."_display = '1' 
$conds_cat 
$conds_loc
GROUP BY ".JOB_TABLE.".".JOB_TABLE."_id 
ORDER BY ".JOB_TABLE."_rank DESC";
更新:修复了两个可能导致PHP错误或错误SQL结果的错误。
更新2:修复了类别/位置筛选器中的一个错误。我首先要确保它不可注入。您直接从用户获取输入并直接发送到数据库。唯一的检查是是否存在某些内容

PHP/MySQL有验证这个的工具。我不确定你用什么函数来查询数据库,但我假设它是标准的MySQL库


但也要注意顶部的红色警告,它过时了(尽管仍然有效)

我首先要确保它不可注入。你直接从用户那里获取输入并直接发送到数据库。唯一的检查是那里有什么东西

PHP/MySQL有验证这个的工具。我不确定你用什么函数来查询数据库,但我假设它是标准的MySQL库


但也要注意顶部的红色警告,它已经过时(尽管仍然有效)

您好,欢迎访问Stack Overflow。此网站旨在回答特定的编程问题。您的问题太模糊,无法正确回答。我只能确认
搜索结果。php
加载需要花费很长时间。我建议您向建立您的网站的公司咨询您的问题,或者聘请其他人来解决此问题o修复它。嗨,卡斯滕,谢谢你的快速回复。我知道这是含糊不清的,但我正试图找出一个起点,这样我就可以自己做这项工作。我检查了mysql表,所有的表都是3-4kb,除了一个80kb大的表,这是我应该研究的,或者可能是php代码本身?再次感谢你哈即使没有给我们任何信息,我也会猜测:如果您的SQL查询像这样
…其中searchfield像“%searchterm%”
,那就是您的问题。SQL中的通配符搜索非常慢。考虑到您的表有多小,我怀疑您的共享主机帐户质量非常差。如果您可以发布任何SQL查询,这将有所帮助您可以在search_results.php文件中看到。事实上,我注意到指定位置和类别的查询执行速度更快,这可能意味着php代码进行了大量处理,但数据库工作正常。您好,欢迎访问Stack Overflow。此网站旨在回答特定的编程问题。Y我们的问题太模糊了,无法正确回答。我可以确认
搜索结果.php
的加载需要很长时间。我建议您向建立您的网站的公司咨询您的问题,或者聘请其他人来解决。嗨,卡斯滕,谢谢您的快速回复。我理解这是模糊的,但我正在努力解决我已经检查了mysql表,除了一个80kb的表外,所有的表都是3-4kb,这是我应该研究的,还是php代码本身?再次感谢你没有给我们任何东西,我会猜测:如果你的SQL查询像这样
…在哪里像“%searchterm%”这样的searchfield
那就是你的问题。通配符searc