0

次の記述のより効率的な方法を知っている人はいますか。私の読み込み時間は現在1分を超えています。これは、さらに長いコードセットの後に思いついたものです。

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

このコードが自明であるかどうか教えてください。

4

4 に答える 4

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

これらの 2 つのステートメントでは、コードが正しければ、同じファイルに対して mysql リクエストを行っているように見えます。これらのリクエストをループの外側で行うと、これである程度の作業が行われるはずです。

于 2012-12-17T16:37:37.380 に答える
0

これらすべてのクエリを実行し、データベースのインデックス作成を監視するには、ストアド プロシージャ (単純なクエリ/ビューで十分かもしれません) を記述します。

于 2012-12-17T16:36:49.547 に答える
0

WHERE EXISTS 句が原因であることはほぼ間違いなく、リファクタリングする必要があります。スロークエリの一般的なガイドライン...

  1. EXPLAIN SELECT を使用して、クエリが実際に何をしているかを確認します
  2. WHERE、JOIN、ORDER、GROUP で使用されるすべての列にインデックスを追加します。
  3. SELECT * を避け、代わりに必要な列のみを SELECT します
  4. 完全なテーブル スキャンを必要としないすべてのクエリに LIMIT を追加します。
于 2012-12-17T16:38:17.053 に答える
0

すでに言及されている回答を除いて、ブラウザに送信する前に mod_deflate を使用してページを圧縮することをお勧めします。これにより、何らかの効果が得られるはずです。ローカル環境にいる場合でも、マシンの負荷のために実行が遅くなる可能性があります。

また、クエリで使用することで最初に失う可能性があるとLIMIT $i, 25 思いますが、同じ効果があると思います。単純な foreach でそれらすべてを取得して完了したら、負荷が少し増加しますが、読み込み時間は短縮されるはずです。

私は 100% の専門家ではありませんが、助けになろうとしています。

于 2012-12-17T16:46:59.600 に答える