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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。