2012-12-17 301 views
0

有誰知道更有效的方式來編寫以下內容。我的加載時間超過一分鐘。這是我在更長的代碼集之後想出來的。PHP查詢加載速度太慢。如何加快速度?

$max = $i + 25; 
while ($i < $max) 
    { 
    $memberno = $memberid; 
    if($pulledid!=$memberid) 
     { 
     $pulledid = mysql_result($result99,$i,"id_member"); 
     $sql_statement = "Select vinyl_fortrade.ImageID,vinyl_fortrade.MemberID from vinyl_fortrade where exists (Select ImageID from vinyl_wanted WHERE MemberID = $memberno AND vinyl_wanted.ImageID = vinyl_fortrade.ImageID) AND vinyl_fortrade.MemberID=$pulledid"; 
     $result=mysql_query($sql_statement)or die(mysql_error());  
     $num=mysql_numrows($result); 
     if($num>0) 
      { 
      $sql_statement2 = "Select vinyl_wanted.ImageID, vinyl_wanted.MemberID from vinyl_wanted where exists (Select ImageID from vinyl_fortrade WHERE MemberID = $memberno AND vinyl_wanted.ImageID = vinyl_fortrade.ImageID) AND vinyl_wanted.MemberID=$pulledid"; 
      $result2=mysql_query($sql_statement2)or die(mysql_error());     
      $num2=mysql_numrows($result2); 
      $membername = mysql_result($result99,$i,"smf_members.member_name"); 
      $userid2 = mysql_result($result99,$i,"smf_members.id_member"); 
      if ($num2 > 0) 
       { 
       $lastlogged = mysql_result($result99,$i,"smf_members.last_login"); 
       echo '<td><a href="http://vinylmationconnection.com/forum/index.php?action=pm;sa=send; u='.$userid.'"style="color: #FFF">'.$membername.'</a><br>Last Logged In:<br>'; 
       echo date('Y-m-d', $lastlogged); 
       echo ':</td>'; 
       echo '<td>'; 
       $n = 0; 
       $m = 0; 
       while ($n < $num) 
        { 
        $title=mysql_result($result,$n,"vinyl_fortrade.ImageID"); 
        $sql_statementj = "Select * from vinyl_figures WHERE ImageID = '$title'"; 
        $resultj=mysql_query($sql_statementj)or die(mysql_error()); 
        $seriess=mysql_result($resultj,0,"vinyl_figures.Series"); 
        echo '<img src="http://vinylmationconnection.com/images/p'.$seriess.'/'.$title.'.jpg">'; 
        $n++; 
        if($n%4=="0") 
         echo "<br>"; 
        } 
       echo '</td><td>'; 
       while ($m < $num2) 
        { 
        $title=mysql_result($result2,$m,"vinyl_wanted.ImageID"); 
        $sql_statementj = "Select Series from vinyl_figures WHERE ImageID = '$title'"; 
        $resultj=mysql_query($sql_statementj)or die(mysql_error()); 
        $seriess=mysql_result($resultj,0,"vinyl_figures.Series"); 
        echo '<img src="http://vinylmationconnection.com/images/p'.$seriess.'/'.$title.'.jpg">'; 
        $m++; 
        if($m%4=="0") 
         echo "<br>"; 
        }        
       echo '</td> </tr>'; 
       } 
      } 
     } 
    $i++; 
    } 

請讓我知道如果代碼是自我解釋。

+2

通常,解決性能問題的方法是在代碼上運行一個分析器,然後讓分析器告訴您哪部分代碼太慢。 –

+1

這段代碼不可能更好的說明一下...從main while循環內移除2個while循環。加入查詢只有** ONE **。我猜主'while'循環在另一個'for'或'foreach'循環中運行......耶穌,這有點耗時,不是嗎?並且'while'中的查詢循環...對不起,這**必須運行緩慢...... – shadyyx

+0

@ moonwave99:完全沒有必要侮辱海報。不要說「這很糟糕」,而要解釋如何改進。如果你不能那樣做,那麼什麼都不要說。 –

回答

2
$sql_statementj = "Select * from vinyl_figures WHERE ImageID = '$title'"; 
$sql_statementj = "Select Series from vinyl_figures WHERE ImageID = '$title'"; 

在這兩個語句中,如果我的代碼正確,您似乎會爲同一個文件發出mysql請求。使這些請求在循環之外,這應該做一些工作。

+1

循環內查詢幾乎總是一個壞主意。沒有正確轉義的查詢*總是*一個壞主意。 – tadman

0

編寫一個存儲過程(可能是一個簡單的查詢/ View就足夠了)來完成所有這些查詢事務並監視數據庫索引。

0

WHERE EXISTS子句幾乎肯定是罪魁禍首,它應該被重構。慢速查詢的一般準則...

  1. 使用EXPLAIN SELECT來看看查詢真的做得
  2. 添加索引在WHERE,JOIN使用的所有列,ORDER,GROUP
  3. 避免SELECT *,而是僅選擇您需要的列
  4. 將LIMIT添加到不需要完整表掃描的所有查詢。
0

除了被認爲是重要的答案之外,我可以建議你在發送給瀏覽器之前使用mod_deflate壓縮頁面,並且應該有一些效果。如果你在本地環境中,也可能導致執行緩慢,因爲機器上的負載。

而且我認爲在查詢中我使用LIMIT $i, 25可能會失去第一個效果。當你用一個簡單的foreach抓取它們,並且完成時,我建議你儘可能地在單個查詢中進行推送,這會增加一些負載,但它會減少加載時間。

我不是100%的專業人士,但我正在努力成爲幫助。