2012-08-26 32 views
0

我有一個足球幻想聯盟的PHP腳本,有20個球隊和400多名球員分配到球隊,我有500個用戶。向數據庫添加一些數據後,php更新代碼很慢?

每個星期都應該給每個玩家分配一個分數,這樣最終每個用戶都會有一個總分數,並且這個分數會產生本賽季的排名。

正常添加了第一週的積分,但第二週的積分變得非常緩慢,第三週的積分出現套接字超時錯誤。

這裏是我使用的是在加分的用戶代碼:

// Adding Point To the user player list 
$sql_user="select * from ".$prev."user LIMIT 0, 100 "; 

$re_user=mysql_query($sql_user); 
while($d_user=mysql_fetch_array($re_user)) 
{ 
$userID=$d_user['id']; 

    $sql_addpointgroup="select * from ".$prev."addpoint group by weekno order by weekno"; 
    $re_addpointgroup=mysql_query($sql_addpointgroup); 
    while($d_addpointgroup=mysql_fetch_array($re_addpointgroup)) 
    {  
     $points=0; 
     $sql_addpoint="select * from ".$prev."addpoint where weekno='".$d_addpointgroup['weekno']."'"; 
     $re_addpoint=mysql_query($sql_addpoint); 
     while($d_addpoint=mysql_fetch_array($re_addpoint)) 
     { 
     $points=$d_addpoint['points']; 
     $sql_weekstatistic="select * from ".$prev."weekstatistic where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'"; 
     $re_weekstatistic=mysql_query($sql_weekstatistic); 
     if(mysql_num_rows($re_weekstatistic)>0) 
     { 
      $sql_update="update ".$prev."weekstatistic set points='$points' where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'"; 

      mysql_query($sql_update); 
     } 
     } 
}  
} 

我有限的用戶數100個用戶每提交即使這樣的代碼仍然緩慢。

慢的只有這個代碼其他網站部分正常工作。

有什麼方法可以用其他更快的方式編寫代碼,或者如果還有其他事情我可以做?

許多在此先感謝,

+0

僅供參考,您的查詢可能並不安全。您不會轉義任何數據以用於查詢,並且可能會被黑客入侵。考慮使用PDO準備好的查詢來避免此問題。 – Brad

+0

我想補充,如果你不希望使用PDO可以使用real_escape_string()來防止SQL注入黑客攻擊你的腳本。這是一個很好的鏈接,展示瞭如何使用它。 http://php.net/manual/en/mysqli.real-escape-string.php – Ishikawa

+0

請您解釋一下,並檢查您是否使用了正確索引的查詢,沒有全表掃描等。 – jfried

回答

1
select * from 

我希望你知道的*SELECT查詢的含義。 這意味着ALL COLUMNS。 您不需要每行的所有列的值。 請在您的查詢中具體說明,並只選擇您需要的列。

例如,這個查詢:

$sql_weekstatistic="select * from ".$prev."weekstatistic where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'"; 

你已經擁有的價值:

weekno @ $d_addpointgroup['weekno'] 
userID @$userID 
playerID @$d_addpoint['playerID'] 

基於其他查詢。

但是,您仍然使用SELECT * FROM

這是我關於性能和SQL的小技巧。

BTW,保護您的查詢,使用mysql_real_escape_tring(), 或者,甚至更好,移動到mysqliPDO作爲@lshikawa是在暗示。

+0

我相信是這樣的話,沒有理由使用'*'除非真的有必要或你的表是非常小的。上投了反對票。瞭解更多關於SQL注入的位置:http://stackoverflow.com/questions/11939226/sql-injections-and-adodb-library-general-php-website-security-with-examples –

0

我不會提及SQL注入的問題,而是建議您遵循本主題中其他人的建議。嚴重 - 如果您要求人們提交個人數據以存儲在您的數據庫中,則應該保護他們免於竊取數據。

您的過程緩慢的原因可能是雙重原因。

首先,當只有一個是必要的時候使用5個查詢。你問的大量數據,你用它來問它更多的問題數據庫 - 不知道您的架構,很難給你一個工作更換,但是這樣的:

update ".$prev."weekstatistic 
set  points = ap.points 
from  weekstatistic ws, 
     addpoint  ap, 
     user   u 
where weekno = //work out the current weeknumber 
and  userID = u.userID 
and  playerID = ap.playerID' 

這應達到同樣的,但只有一個查詢;這應該快得多。

其次,你可能沒有你的表進行正確的指標 - 這是一個經典的原因「正如我在表中獲取更多的數據我的查詢變慢」。閱讀EXPLAIN,並添加一些索引。