当前位置: 首页 > 后端技术 > PHP

php程序内存优化之数组操作优化

时间:2023-03-30 02:13:32 PHP

设计数据表如下:createtableoptimization(idINTNOTNULLAUTO_INCREMENT,valueVARCHAR(10)NOTNULL,PRIMARYKEY(id));现在有个业务需求,需要批量插入数据。让我们看一下下面这段代码:getMessage();}$begin=microtime(true)*1000;$计数=100;$stmt=$dbh->prepare('INSERTINTO`optimization`(id,value)VALUES(:id,:value)');$stmt->bindParam(':id',$id);$stmt->bindParam(':value',$value);对于($i=0;$i<$count;$i++){$id='';$值=$i;$stmt->执行();}$结束=微时间(真)*1000;echo'excuted:',($end-$begin),'ms';经测试,上述代码运行结果如下:1.执行:7601.4348144531ms2。执行:7476.4270019531ms3。执行:7674.4387207031ms平均:7584.100179036433ms再看第二段代码:getMessage();}$begin=microtime(true)*1000;$dbh->beginTransaction();尝试{$count=100;$sql='INSERTINTO`optimization`(id,value)VALUES';$sql_arr=数组();$sql_str='';对于($i=0;$i<$count;$i++){$sql_arr[]=("('',$i)");$sql_str=implode(',',$sql_arr);$sql.=$sql_str;$stmt=$dbh->准备($sql);$stmt->执行();$dbh->提交();}catch(Exception$e){$dbh->rollBack();回显$e->getMessage()。'
';}$end=microtime(true)*1000;echo'excuted:',($end-$begin),'ms';上述代码运行结果如下:1.Excuted:99.005859375ms2。执行:103.00610351562ms3。Excuted:68.00390625平均ms:90.00528971354ms分析发现,在第二段代码中,使用了批量插入,此时的效率比第一段提高了84%原因如下:在使用第一段代码时,由于每循环执行一条mysql语句,php需要先获取与mysql的连接,然后执行mysql语句,然后断开连接。这是第一段代码的主要时间开销——PHP和MySQL之间的网络传输IO第一段代码解析了更多的SQL语句。因此,在第二段代码中,通过合并SQL语句减少了SQL语句的解析。PHP和MySQL的连接次数和连接数,减少网络传输IO的开销。注意:1.SQL语句有长度限制。因此,在合并SQL语句时一定不能超过SQL长度限制。可以通过设置max_allowed_pa??cket来修改。默认1M,测试时修改为8M。小结在对数据库进行批量操作(如:insert、update、modify)时,尽量将SQL语句组合起来再执行,而不是循环顺序执行。