大家帮讨论一下,php写数据库的速度如何优化??运行中执行速度慢,请高手出来帮查原因
小弟拿个实例来讲,也许清楚点!
两个页面:lineclear5.php updateclear5.php
说明:当lineclear5.php页面提交时,传值到updateclear5.php,执行updateclear5.php页面中的相关数据库操作。
出现问题:测试用机测试时候并没有出现提交缓慢的问题,但在生产用机上提交时,大概要30秒才能提交成功,严重影响速度。
程序如下(摘录):
--------------lineclear5.php------------
document.form1.Submit.disabled=true;
document.form1.action="updateclear5.php?a=<? echo $a?>&type1=<?echo $type?>&rrurkey1=<?echo $rrurkey?>";
document.form1.submit();
--------------updateclear5.php----------------------
<?
session_start();
set_time_limit(300);
require "getmax2.php";
//$max=getmax2("postdevice.rp_line","lineid")+1;
$hisid=getmax2("postdevice.rp_LineHistory","LineHisID")+1;//历史线索号
//include "connect.php";
$conn=oracle_connect();
$query="select linecount,leftlinecount,repairid,outlinecount from rp_report where rrid='".$a."'";
$stmt=ociparse($conn,$query);
$ok=ociexecute($stmt);
while(ocifetch($stmt))
{
$linecount=ociresult($stmt,1);//查出维修线索总数
$leftcount=ociresult($stmt,2);
$repairid=ociresult($stmt,3);
$outcount=ociresult($stmt,4); //还未销号的数
}
if($OPName1) //add by pj on 2006-1-23 防止session超时处理
{
if($select==7) //表示 已完成
{
if($linecount==0)
{
$lineno=1; //维修单的序号而已(1、2、3......)
}
else
{
$lineno=$linecount+1;
}
$query="insert into postdevice.rp_line values(seq_lineid.nextval,'".trim($a)."',sysdate,sysdate,sysdate,'',".$select.",'".$OPName1."','".trim($linetext3)."','".trim($sblx)."','".$sbbh."','".trim($sbmc)."','',".$BZFLAG1.",'$dmkey1','$REPAIRMAN_ID',".$lineno.",sysdate,'$rrurkey1','')";
$stmt=ociparse($conn,$query);//echo $query;
@$ok1=ociexecute($stmt,ocidefault);
//$leftlinecount=$leftcount-1; //完成则维修线索总数减1
$alllinecount=$linecount+1;
$outlinecount=$outcount+1; //未销号
$query="update rp_report set linecount=".$alllinecount.",outlinecount=".$outlinecount.",rrstatus='A' where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
@$ok2=ociexecute($stmt,ocidefault);
if($leftcount==0)//报障单的状态改为"已完成"
{
$query="update rp_report set rrstatus='X',finishtime=sysdate where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
@$ok3=ociexecute($stmt,ocidefault);
}
if(!$ok1 || !$ok2)
{
//echo "hahahahhaha";
ocirollback($conn);
return;
}
else
ocicommit($conn);
}
else if($select==10||$select==11)//表示电话or远程
{
if($linecount==0)
{
$lineno=1; //维修单的序号而已(1、2、3......)
}
else
{
$lineno=$linecount+1;
}
$query="insert into postdevice.rp_line values(seq_lineid.nextval,'".trim($a)."',sysdate,sysdate,sysdate,sysdate,".$select.",'".$OPName1."','".trim($linetext3)."','".trim($sblx)."','".$sbbh."','".trim($sbmc)."','',".$BZFLAG1.",'$dmkey1','$REPAIRMAN_ID',".$lineno.",sysdate,'$rrurkey1','')";
$stmt=ociparse($conn,$query);echo $query;
@$ok1=ociexecute($stmt,ocidefault);
if($ok1==1)
{
ocicommit($conn);
}
else
{
ocirollback($conn);
return;
}
$alllinecount=$linecount+1;
$query="update rp_report set linecount=".$alllinecount.",rrstatus='A' where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
$ok=ociexecute($stmt);
if($leftcount==0)//报障单的状态改为"已完成"
{
$query="update rp_report set rrstatus='X',finishtime=sysdate where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
$ok=ociexecute($stmt);
}
if($outcount==0)//未销号数为0, 置为 已销号
{
$query="update rp_report set rrtimefinish=sysdate,rrstatus='f' where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
$ok=ociexecute($stmt);
}
}
else if($select==4) //表示直接送修硬件组
{
//$query="update rp_line set content='".trim($content)."',dostatus=".$select.", repairbz=14,repairxz=18,repairman='' where lineid=".$lineid."";
if($linecount==0)
{
$lineno=1; //维修单的序号而已(1、2、3......)
}
else
{
$lineno=$linecount+1;
}
$query="insert into postdevice.rp_line values(seq_lineid.nextval,'".trim($a)."',sysdate,sysdate,'','',".$select.",'".$OPName1."','".trim($linetext3)."','".trim($sblx)."','".$sbbh."','".trim($sbmc)."','','14','18','',".$lineno.",sysdate,'$rrurkey1','')";
$stmt=ociparse($conn,$query);//echo $query;
$ok=ociexecute($stmt);
$alllinecount=$linecount+1;
$leftlinecount=$leftcount+1;
$outlinecount=$outcount+1; //未销号
$query="update rp_report set linecount=".$alllinecount.",leftlinecount=".$leftlinecount.",outlinecount=".$outlinecount.",rrtimereceive=sysdate,rrstatus='A',finishtime='',rrtimefinish='' where rrid=".$a."";
$stmt=ociparse($conn,$query);//echo $query;
$ok=ociexecute($stmt);
}
if(!$ok)
{
echo "提交不成功,请重新提交!";
return;
}
echo "维修线索转交成功!<br>";
} //194行
//插入维修线索历史表
$query="insert into rp_LineHistory values(".$hisid.",seq_lineid.currval,'".$a."',sysdate,'$select','".$OPName1."','".trim($linetext4)."')";
$stmt=ociparse($conn,$query);//echo $query;
ociexecute($stmt);
ocifreestatement($stmt);
ocilogoff($conn);
}
else
{
ocifreestatement($stmt);
echo "超时,session丢失,请重新登陆!";
return;
}
echo "<script>";
echo "location='rocess1.php?URName=".$URName."&URKey1=".$URKey1."&SESSxhflag=".$SESSxhflag."&a=".$a."&OPName1=".$OPName1."'";
echo "</script>";
?>
这里$select是lineclear5.php 传过来的值,当提交时运行速度十分慢,页面提交差不多要30秒才能成功。不知道有何优化措施,请指教!!!!
问题点数:60、回复次数:10Top
1 楼gu1dai(异域苍穹.百年飞行)回复于 2006-02-09 17:20:26 得分 15
代码太多,你自己分析了。Top
2 楼gu1dai(异域苍穹.百年飞行)回复于 2006-02-09 17:21:03 得分 0
可能是数据量的问题。
建议用索引什么的优化下库再说。Top
3 楼yao_yao_(yaoyao)回复于 2006-02-09 17:37:44 得分 0
我已经对于用到的数据表建立了索引,但是感觉没有多大提高哟!Top
4 楼yao_yao_(yaoyao)回复于 2006-02-09 21:20:45 得分 0
有没有高手出来指点一下~~~!!!Top
5 楼ashchen(老陳)回复于 2006-02-10 08:30:32 得分 25
把mysql超过3秒的查询记录下来,my.cnf里有设置
然后分析慢的sql,否则光靠代码看不出所以然
欢迎来irc讨论
客户端下载
http://cosrc.com:8800/down/mirc.rarTop
6 楼yao_yao_(yaoyao)回复于 2006-02-10 08:56:09 得分 0
忘了说了,我用到的后台数据库为oracle816Top
7 楼syre(神仙)回复于 2006-02-10 11:10:53 得分 15
贴那么长的代码做什么
难道还要我们一点点看啊
把相关的抽出来就行了
如果是写入速度慢,考虑去掉不必要的索引Top
8 楼yh801216(艾奥利斯)回复于 2006-02-10 11:14:20 得分 5
呵呵,老大们都说了,hoho。
还是自己先确定下哪些语句的问题吧Top
9 楼yao_yao_(yaoyao)回复于 2006-02-10 14:31:09 得分 0
我在程序中加了调试代码如下:
<?
$time_start = getmicrotime();
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
?>
然后到最后加入以下代码
<?
$time_end = getmicrotime();
printf ("[页面执行时间: %.2f毫秒]\n\n",($time_end - $time_start)*1000);
?>
经过分段调试,终于找到原因了,原来是下面这句的问题
$hisid=getmax2("postdevice.rp_LineHistory","LineHisID")+1;//历史线索号
调用的函数执行时间达到了28秒,呵呵,终于找到了。修改后正常了,谢谢大家!!!
Top
10 楼yao_yao_(yaoyao)回复于 2006-02-10 14:38:29 得分 0
总结一下:原来定位错了。
总以为是分支处理的sql语句或数据库影响造成的。因此查了很久但是都没找到原因,唉!!真是郁闷了好久,看来程序调试很重要!Top




