我正在尝试进行一个很长的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());
}
}
}
}
答案 0 :(得分:0)
一定要尝试@rid建议的内容,并在服务器上执行查询并查看调试的结果/持续时间 - 如果查询不是一个简单的查询,那么就像在PHP脚本中一样构造它,并且只回显SQL命令,不必执行它,只需将其复制到服务器MySQL命令行或您使用的任何工具。
如果你有shell访问权限,请在再次运行上面的脚本后使用top命令,看看MySQL恶魔服务器是否有资源来查看它是否真的是原因。
您还可以尝试更简单的查询来代替较长的查询吗?就像一个简单的SELECT count(*) FROM tvshows
,看看是否还需要很长时间才能返回一个值?
希望这些建议有所帮助。
答案 1 :(得分:0)
您的代码存在很多问题。
actors
列是竖线分隔的文本。这是一个很大的禁忌。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)?
如果您有任何其他问题,请与我们联系。