-1

私は長いmysqlクエリを作成し、作成された行を処理および更新しようとしています:

$query = 'SELECT tvshows.id_show, tvshows.actors FROM tvshows where tvshows.actors is not NULL';
$result = mysql_query($query);

$total = mysql_num_rows($result);
echo $total;

while ($db_row = mysql_fetch_assoc($result)) 
{
//process row
}

しかし、60秒後にタイムアウトリクエストが表示されたので、これらをphpコードに挿入しようとしました:

set_time_limit(400);

同じだけどどうしたらいいの?

編集: クエリのみ:

 $query = 'SELECT tvshows.id_show, tvshows.actors FROM tvshows where tvshows.actors is not NULL';

実行に2〜3秒かかるので、phpですべての結果を繰り返して行に挿入または更新するときに問題があると思うので、問題はphpにあると思います。タイムアウトを変更するにはどうすればよいですか?

編集

ここに完全なコードがあります。コードに問題があるとは思いません...

$query = 'SELECT tvshows.id_show, tvshows.actors FROM tvshows where tvshows.actors is not NULL';
$result = mysql_query($query);

$total = mysql_num_rows($result);
echo $total;

while ($db_row = mysql_fetch_assoc($result)) {
   //print $db_row['id_show']."-".$db_row['actors']."<BR>";
   $explode = explode("|", $db_row['actors']);

   foreach ($explode as $value) {
      if ($value != "") {

         $checkactor = mysql_query(sprintf("SELECT id_actor,name FROM actors WHERE name = '%s'",mysql_real_escape_string($value))) or die(mysql_error());

         if (mysql_num_rows($checkactor) != 0) {
            $actorrow = mysql_fetch_row($checkactor);
            $checkrole = mysql_query(sprintf("SELECT id_show,id_actor FROM actor_role WHERE id_show = %d AND id_actor = %d",$db_row['id_show'],$actorrow[0])) or die(mysql_error());

                if (mysql_num_rows($checkrole) == 0) {
               $insertactorrole = mysql_query(sprintf("INSERT INTO actor_role (id_show, id_actor) VALUES (%d, %d)",$db_row['id_show'],$actorrow[0])) or die(mysql_error());
            }

         } else {
            $insertactor = mysql_query(sprintf("INSERT INTO actors (name) VALUES ('%s')",mysql_real_escape_string($value))) or die(mysql_error());
            $insertactorrole = mysql_query(sprintf("INSERT INTO actor_role (id_show, id_actor, role) VALUES (%d, %d,'')",$db_row['id_show'],mysql_insert_id())) or die(mysql_error());

         }
      }
   }
}
4

2 に答える 2

0

コードには非常に多くの問題があります。

  • 1 つの列に複数の値を格納しないでください。列actorsはパイプ区切りのテキストです。これは大したことではありません。
  • 追加のクエリの代わりに JOIN を使用します。単一のクエリでこのすべてのデータを取得できます (上記が当てはまらない場合は取得できます)。
  • すべてのコードは、サーバー上の 1 つのクエリで実行できます。私が見ているように、ユーザーからの入力はなく、出力も生成されません。テーブルを更新するだけです。なぜPHPでこれを行うのですか?について学びINSERT...SELECT...ます。

始めるためのリソースを次に示します (Google から入手しましたが、それらで十分であることを願っています)。

http://www.sitepoint.com/understanding-sql-joins-mysql-database/

http://dev.mysql.com/doc/refman/5.1/en/join.html

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

正規化 (または正規化) とは何ですか?

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-03-09T14:42:19.110 に答える
0

@ridが提案したことを必ず試して、サーバーでクエリを実行し、デバッグする結果/期間を確認する必要があります-クエリが単純なものでない場合は、PHPスクリプトで行うように構築し、SQLコマンドのみをエコーし​​ます実行する必要はなく、それをサーバーのMySQLコマンドラインまたは使用するツールにコピーするだけです.

シェル アクセス権がある場合は、上記のスクリプトを再度実行した後にtopコマンドを使用し、MySQL デーモン サーバーがリソースを急増させているかどうかを確認して、それが本当に原因であるかどうかを確認します。

長いクエリの代わりに、より単純なクエリを試すこともできますか? 単純なように、SELECT count(*) FROM tvshowsそれも値を返すのに長い時間がかかるかどうかを確認しますか?

これらの提案がお役に立てば幸いです。

于 2013-03-09T14:04:52.607 に答える