0

私はサッカー ファンタジー リーグの php スクリプトを持っています。20 のチームと 400 人以上のプレーヤーがチームに割り当てられており、500 人のユーザーがいます。

毎週、各プレーヤーにポイントが割り当てられる必要があるため、最終的にすべてのユーザーがフォーメーションから合計ポイントを取得し、シーズンのランキングが生成されます。

1週目ポイントは正常に追加されましたが、2週目ポイントでaddpontセクションが非常に遅くなり、3週目ポイントでソケットタイムアウトエラーが発生しました。

ユーザーにポイントを追加する際に使用しているコードは次のとおりです。

// 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 ユーザーに制限しましたが、それでもコードは遅くなります。

速度が遅いのはこのコードのみで、他の Web サイト セクションは正常に動作しています。

他のより速い方法でコードを書く方法はありますか、それとも何か他にできることはありますか?

よろしくお願いします。

4

2 に答える 2

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に関する私の小さなヒントです。

ところで、、またはを使用してクエリを保護しmysql_real_escape_tring()、さらに良いことに、@lshikawaが提案しているようにmysqliまたはに移動します。PDO

于 2012-08-26T19:41:32.590 に答える
0

このスレッドの他の人からの推奨事項に従うことをお勧めする以外に、SQL インジェクションの問題については言及しません。真剣に、データベースに保存するために個人データを送信するように人々に依頼している場合は、そのデータが盗まれないように保護する必要があります。

プロセスが遅い理由は、おそらく 2 つあります。

まず、必要なクエリが 1 つだけの場合に、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'

これは同じことを達成する必要がありますが、1 つのクエリのみです。それははるかに速いはずです。

次に、テーブルに適切なインデックスが設定されていない可能性があります。これは、「テーブルにデータを追加するとクエリが遅くなる」という典型的な原因です。EXPLAIN を読み、いくつかのインデックスを追加します。

于 2012-08-26T20:40:16.477 に答える