2012-02-17 15 views
0

次のコードの結果は非常に遅いです。私は何時間もそれをトラブルシューティングしようとしていましたが、結果はありませんでした。私は関連するコードだけを含んでいます。mysql_fetch_arrayでwhileループを使用した場合の結果が遅い

編集:

私は、データベースからIDを選択し、それに関連付けられているすべての画像を取得するためにそのIDを使用しようとしています。私はそのイメージのグループを1つに絞り込んでいます。私はそのイメージを持っていれば、それを外部ファイルを通してサイズ変更しています。

問題を特定するためにコードのさまざまな部分を削除しようとしましたが、2番目のクエリでスローダウンが発生しているように見えますが、その理由はわかりません。ご協力いただきありがとうございます。

$getworks = mysql_query ("SELECT a_id from artists where display_works = '1' and active = '1' order by project_year desc, fullname desc"); 

while ($getworksrow = mysql_fetch_assoc($getworks)){ 
      $totalimages=1; 
      $addstyle = ""; 
      $id = $getworksrow["a_id"]; 
      $getimages = mysql_query ("SELECT a_id, image_id from images where a_id = '". $id ."' order by position asc LIMIT 1"); 
      $getimagesrow = mysql_fetch_assoc($getimages); 

      foreach ($getimagesrow as $getimagesrows){ 
       extract($getimagesrow); 

       if($totalimages > 1){ $addstyle = 'style="display:none;"'; } 
       else { 
       $myimagename = "http://artist.com/$a_id/images/$image_id" . "_large.jpg"; 
       list($width, $height, $type, $attr) = getimagesize("$myimagename"); 
       $myimagename = "http://artist.com/artists/resize.php/$a_id/images/$image_id" . "_large.jpg?resize(157x2000)"; 

       if($getworksrows["layout"] == "vert"){$pl = "_vertical";}else if($getworksrows["layout"] == "website"){$pl = "-s";}else if($getworksrows["layout"] == "video"){$pl = "_video";}else{$pl = "_horizontal";} 
       echo "<li class='thumbnail_container' $addstyle> <a class='thumbnail' href=\"../works$pl.php?a_id=" . $getworksrows["a_id"] . "\"><span><img src=\"$myimagename\" /></span>\n</a></li>\n"; 
       } 

       $totalimages++; 
      } 

} 
+1

リモートURLの 'getimagesize'が遅い可能性があります。それをスピードアップする方法はないかもしれません。結果をどこかにキャッシュしていますか? –

+0

あなたの質問、あなたが何をしようとしているのかもっと具体的にしてください。 –

+1

入れ子のSQLクエリは常に大きなパフォーマンスオーバーヘッドです。この場合、1つのイメージクエリにつき1を発行します。あなたはJOINについて学ぶ) –

答えて

2

それは親クエリが大きなノーを持っている特別な場合に、このようなクエリを実行するために、大きなパフォーマンスのオーバーヘッドです。レコードの。

画像テーブルを持つ結合アーティストテーブルを使用し、すべてのデータを単一のクエリで取得する必要があります。

後で、アーティストと画像ごとに2D配列を作成します。ループデータに

以下

を表示するには、2次元配列に応じては、あなたが使用する必要があるクエリを結合です:

while ($getworksrow = mysql_fetch_object($getworks)){ 

    $data['a_id']['img_id']=$getworksrow->image; //Make 2D array 
    ........ 
    ........ 

    } 

ループと表示データ:

foreach($data as $id=>$images) 
{ 
    foreach($images as $val){ 
    // Do your stuff for displaying data 
    } 

} 
しばらく

SELECT * from artists as art 
left join images as img on art.a_id=img.a_id 
where display_works = '1' and active = '1' 
order by project_year desc, fullname desc 

データ配列を作ります

必要な変更を行ってください。

+0

私はあなたがhttp://stackoverflow.com/q/9156109/575527 – Joseph

+0

あなたはより徹底的にこれを説明することができます加入の効果で「組み合わせ」を持っている場合、これが役立つと仮定しますか?私は理解していません。 –

+0

whileステートメントに続く行はわかりません。 [$ artist_id]、[$ img_is]、$ getworksrow-> imageはどこで定義されましたか? –

関連する問題