php请求mysql查询超时
我正在尝试进行长时间的mysql查询和处理,并更新创建的行:php请求mysql查询超时,php,mysql,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
$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());
}
}
}
}
$query='SELECT tvshows.id_show,tvshows.actors FROM tvshows,其中tvshows.actors不为空';
$result=mysql\u query($query);
$total=mysql\u num\u行($result);
echo$总计;
而($db\u row=mysql\u fetch\u assoc($result)){
//打印$db_行['id_show']。“-”$db_行['actors']。“
”;
$explode=explode(“|”,$db_行['actors');
foreach($explode as$value){
如果($value!=“”){
$checkactor=mysql\u query(sprintf(“选择id\u actor,从actors中选择name='%s',mysql\u real\u escape\u string($value)))或die(mysql\u error());
if(mysql\u num\u行($checkactor)!=0){
$actorrow=mysql\u fetch\u行($checkactor);
$checkrole=mysql\u查询(sprintf(“从参与者角色中选择id\u show、id\u actor,其中id\u show=%d和id\u actor=%d)”、$db\u行['id\u show']、$actorrow[0])或死亡(mysql\u error());
if(mysql_num_rows($checkrole)==0){
$insertactorrole=mysql\u查询(sprintf(“插入到参与者角色(id\u show,id\u actor)值(%d,%d)”,$db\u行['id\u show'],$actorrow[0]))或die(mysql\u error());
}
}否则{
$insertactor=mysql\u query(sprintf(“插入到actors(名称)值('%s')”),mysql\u real\u escape\u string($value)))或die(mysql\u error());
$insertactorrole=mysql\u query(sprintf(“插入到参与者角色(id\u show,id\u actor,role))值(%d,%d,)”、$db\u行['id\u show']、mysql\u INSERT\u id())或die(mysql\u error());
}
}
}
}
绝对应该尝试@rid建议的方法,在服务器上执行查询并查看调试结果/持续时间-如果查询不是简单的查询,请像在PHP脚本中一样构造它,只回显SQL命令,而不必执行它,只需将其复制到服务器MySQL命令行或您使用的任何工具
如果您有shell访问权限,请在再次运行上述脚本后使用该命令,并查看MySQL demon服务器是否正在增加资源,以确定这是否真的是原因
您是否可以尝试使用更简单的查询来代替较长的查询?就像一个简单的从电视节目中选择count(*),看看返回值是否也需要很长时间
希望这些建议对您有所帮助。您的代码有很多问题
- 不要在一列中存储多个值。您的
actors
列是以管道分隔的文本。这是一个大禁忌
- 使用联接而不是其他查询。您可以(或者,如果以上不正确的话)在一个查询中获得所有这些数据
- 所有代码都可以在服务器上的单个查询中完成。在我看来,它不接受用户的输入,也不产生输出。它只是更新一个表。为什么要在PHP中这样做?了解
插入…选择…
以下是一些帮助您入门的资源(来自谷歌,但希望它们足够好):
如果您还有其他问题,请告诉我。如果在MySQL服务器上执行查询需要多长时间,它会返回多少条记录?我没有尝试过,因为这不是一个简单的查询,我必须在php中分解一些字符串并将其插入数据库,我不知道在MySQL服务器中是否可行……嗯,如果执行查询需要一分钟的时间,那么您就有一个需要在数据库服务器上解决的问题,并且您不能从PHP中做很多事情。另一方面,如果查询执行速度很快,那么问题可能是PHP中正在进行的处理。因此,在调试之前,首先找出问题的确切位置是很重要的,否则您只是在猜测。在新代码中。它们不再得到维护。看到了吗?相反,请了解,并使用or-将帮助您决定哪一个。@Piero,如果这是一个PHP问题,那么您需要找到该//进程行代码的哪一部分正在减慢速度。根据您的提示,听起来您也在那里执行一些INSERT
s操作,如果您正在为每行执行INSERT
,那么这可能是问题之一。但是除非你发布你正在做的事情,否则我不确定你能得到多少帮助…感谢我尝试过的答案,我的sql查询需要3秒钟…行的处理也需要时间…所以我认为这是php的问题…谢谢你的回答,我可以在mysql中调用explode()。@Piero:不,你不需要这样做。这就是规范化的要点,不使用多值列。如果您有任意数量的值,请将它们存储在一组行中,而不是存储在列中的单个值中。