1

私はサッカーファンタジーリーグのスクリプトを持っており、毎週次のコードを使用してユーザーにポイントを追加しています。

$sql_user="select * from ".$prev."user ";

$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);
    }
  }
}   
}

最初はこのコードは正常に機能していましたが、登録ユーザー数が500ユーザーに達した後、更新プロセスが非常に遅くなり、タイムアウトエラーメッセージが表示されることがあります。

このコードを書き直して、更新プロセスを高速化する方法はありますか?

よろしくお願いします。

4

1 に答える 1

0

ネストされたループは、必要なデータを取得するためだけに何千ものクエリを簡単に実行できることを意味します。join代わりに試してください:

SELECT * FROM (SELECT * FROM addpoint GROUP BY weekno ORDER BY weekno) AS a JOIN addpoint USING weekno

そのクエリを使用すると、1 つの結果配列だけをループできます。

更新に関しては、使用できるショートカットを次に示します。weeknoただし、テーブルで一意のインデックスとして定義されている場合にのみ、これを使用できます。

INSERT INTO weekstatistic (weekno,points) VALUES {$vals} ON DUPLICATE KEY UPDATE points=VALUES(points)

{$vals}weekno/points 値のカンマ区切りのリストである必要があります。

$tmp = Array();
// build an array like so:
$tmp[] = "('".$weekno."','".$points."')";
// at the end of the loop:
$vals = implode(",",$tmp);
// now run the query.

理想的には、たった 2 つのクエリですべてを実行できます。

于 2012-10-01T20:22:24.347 に答える