php请求mysql查询超时

时间:2013-03-09 13:50:57

标签: php mysql

我正在尝试进行一个很长的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());

         }
      }
   }
}

2 个答案:

答案 0 :(得分:0)

一定要尝试@rid建议的内容,并在服务器上执行查询并查看调试的结果/持续时间 - 如果查询不是一个简单的查询,那么就像在PHP脚本中一样构造它,并且只回显SQL命令,不必执行它,只需将其复制到服务器MySQL命令行或您使用的任何工具。

如果你有shell访问权限,请在再次运行上面的脚本后使用top命令,看看MySQL恶魔服务器是否有资源来查看它是否真的是原因。

您还可以尝试更简单的查询来代替较长的查询吗?就像一个简单的SELECT count(*) FROM tvshows,看看是否还需要很长时间才能返回一个值?

希望这些建议有所帮助。

答案 1 :(得分:0)

您的代码存在很多问题。

  • 不要在一列中存储多个值。您的actors列是竖线分隔的文本。这是一个很大的禁忌。
  • 使用JOIN而不是其他查询。您可以(或者,如果上述情况不正确)可以在单个查询中获取所有这些数据。
  • 您可以在服务器上的单个查询中完成所有代码。在我看来,它不需要用户输入并且不产生输出。它只是更新一个表。为什么用PHP?了解INSERT...SELECT...

以下是一些可以帮助您入门的资源(来自谷歌搜索,但希望它们足够好):

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

What is Normalisation (or Normalization)?

如果您有任何其他问题,请与我们联系。