PHP项目中怎样批量操作MySQL
Admin 2022-09-23 群英技术资讯 269 次浏览
今天我们来学习关于“PHP项目中怎样批量操作MySQL”的内容,下文有详解方法和实例,内容详细,逻辑清晰,有需要的朋友可以参考,希望大家阅读完这篇文章后能有所收获,那么下面就一起来了解一下吧。
本文实例讲述了PHP优化之批量操作MySQL。分享给大家供大家参考,具体如下:
设计一个数据表如下:
create table optimization( id INT NOT NULL AUTO_INCREMENT, value VARCHAR(10) NOT NULL, PRIMARY KEY(id) );
现在有一个业务需求需要批量插入数据。
先来看看下面这一段代码:
<?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $password = 'root'; try { $dbh = new PDO($dsn, $user, $password); } catch(PDOException $e) { echo 'Connection failed: ' , $e->getMessage(); } $begin = microtime(true) * 1000; $count = 100; $stmt = $dbh->prepare('INSERT INTO `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.4348144531 ms
2、excuted : 7476.4270019531 ms
3、excuted : 7674.4387207031 ms
平均:7584.100179036433 ms
再来看看第二段代码:
<?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $password = 'root'; try { $dbh = new PDO($dsn, $user, $password); } catch(PDOException $e) { echo 'Connection failed: ' , $e->getMessage(); } $begin = microtime(true) * 1000; $dbh->beginTransaction(); try { $count = 100; $sql = 'INSERT INTO `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() . '<br>'; } $end = microtime(true) * 1000; echo 'excuted : ' , ($end - $begin) , ' ms';
上面这段代码的运行结果如下:
1、excuted : 99.005859375 ms
2、excuted : 103.00610351562 ms
3、excuted : 68.00390625 ms
平均:90.00528971354 ms
##分析 可以看出,在第二段代码中,使用了批量插入,此时的效率比第一段提高了84%。原因如下:
- 使用第一段代码的时候,因为每一次循环里都执行了一个mysql语句,此时php需要与mysql获得连接,然后再执行mysql语句,然后再断开。这就是第一段代码最主要的时间开销�CPHP与MySQL连接的网络传输IO
- 第一段代码SQL语句解析的次数更多
因此,在第二段代码中,通过合并SQL语句来实现减少SQL语句解析的次数以及PHP与MySQL连接的次数来达到减少网络传输IO的开销。
注意: 1、SQL语句是有长度限制的,因此,在进行SQL语句合并时务必不能超过SQL长度限制,通过设置max_allowed_packet可以修改,默认是1M,测试时修改为8M。
##总结
在进行对数据库的批量操作(如:插入、更新、修改)时,应当尽可能将SQL语句合并后再执行而不是在循环中依次执行。
记录下最近在项目中犯下的一个比较大的错误,以后不能再犯了。以前一直都没有注意到,直到现在真正参与到企业项目中,自己的代码被老大指出错误后才发现自己的错误。学习了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
php laravel框架自带命令的实现:1、作为服务提供者加载到程序中,laravel自带的artisan命令;2、然后找到 Up/Down命令入口;3、DownCommand实现,关键在当前存储目录/framework 下面创建。
PHP5支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法...
laravel竟是最慢框架,比lumen慢了一倍?就连tp都比laravel快50%?这究竟是怎么回事呢?来这里看框架性能大对比,看看比对过程。
这篇文章主要介绍了Laravel框架实现的批量删除功能,结合实例形式分析了Laravel框架批量删除功能相关的前端界面布局及后台控制器实现技巧,需要的朋友可以参考下
swoole保持不掉线的方法:Swoole扩展可以通过心跳机制来保持不掉线,这个机制保证服务器和客户端之间连接的有效性。Swoole扩展本身内置了这种机制,开发者只需要配置一个参数即可启用。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008