PHP优化之批量操作MySQL实例分析
本文实例讲述了PHP优化之批量操作MySQL。分享给大家供大家参考,具体如下:
设计一个数据表如下:
createtableoptimization( idINTNOTNULLAUTO_INCREMENT, valueVARCHAR(10)NOTNULL, PRIMARYKEY(id) );
现在有一个业务需求需要批量插入数据。
先来看看下面这一段代码:
getMessage();
}
$begin=microtime(true)*1000;
$count=100;
$stmt=$dbh->prepare('INSERTINTO`optimization`(id,value)VALUES(:id,:value)');
$stmt->bindParam(':id',$id);
$stmt->bindParam(':value',$value);
for($i=0;$i<$count;$i++)
{
$id='';
$value=$i;
$stmt->execute();
}
$end=microtime(true)*1000;
echo'excuted:',($end-$begin),'ms';
经过测试,上面代码运行结果如下:
1、excuted:7601.4348144531ms
2、excuted:7476.4270019531ms
3、excuted:7674.4387207031ms
平均:7584.100179036433ms
再来看看第二段代码:
getMessage();
}
$begin=microtime(true)*1000;
$dbh->beginTransaction();
try{
$count=100;
$sql='INSERTINTO`optimization`(id,value)VALUES';
$sql_arr=array();
$sql_str='';
for($i=0;$i<$count;$i++)
{
$sql_arr[]=("('',$i)");
}
$sql_str=implode(',',$sql_arr);
$sql.=$sql_str;
$stmt=$dbh->prepare($sql);
$stmt->execute();
$dbh->commit();
}catch(Exception$e){
$dbh->rollBack();
echo$e->getMessage().'
';
}
$end=microtime(true)*1000;
echo'excuted:',($end-$begin),'ms';
上面这段代码的运行结果如下:
1、excuted:99.005859375ms
2、excuted:103.00610351562ms
3、excuted:68.00390625ms
平均:90.00528971354ms
##分析可以看出,在第二段代码中,使用了批量插入,此时的效率比第一段提高了84%。原因如下:
- 使用第一段代码的时候,因为每一次循环里都执行了一个mysql语句,此时php需要与mysql获得连接,然后再执行mysql语句,然后再断开。这就是第一段代码最主要的时间开销–PHP与MySQL连接的网络传输IO
- 第一段代码SQL语句解析的次数更多
因此,在第二段代码中,通过合并SQL语句来实现减少SQL语句解析的次数以及PHP与MySQL连接的次数来达到减少网络传输IO的开销。
注意:1、SQL语句是有长度限制的,因此,在进行SQL语句合并时务必不能超过SQL长度限制,通过设置max_allowed_packet可以修改,默认是1M,测试时修改为8M。
##总结
在进行对数据库的批量操作(如:插入、更新、修改)时,应当尽可能将SQL语句合并后再执行而不是在循环中依次执行。
记录下最近在项目中犯下的一个比较大的错误,以后不能再犯了。以前一直都没有注意到,直到现在真正参与到企业项目中,自己的代码被老大指出错误后才发现自己的错误。学习了。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
