-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

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

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

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

希望这些建议有所帮助。

于 2013-03-09T14:04:52.607 回答
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

什么是标准化(或标准化)?

如果您还有其他问题,请告诉我。

于 2013-03-09T14:42:19.110 回答