PHP优化之批量操作MySQL实例分析 |
本文标签: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'; 经过测试,上面代码运行结果如下:
平均: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'; 上面这段代码的运行结果如下:
平均:90.00528971354 ms ##分析 可以看出,在第二段代码中,使用了批量插入,此时的效率比第一段提高了84% 。原因如下:
因此,在第二段代码中,通过合并SQL语句来实现减少SQL语句解析的次数以及PHP与MySQL连接的次数来达到减少网络传输IO的开销 。 注意: 1、SQL语句是有长度限制的,因此,在进行SQL语句合并时务必不能超过SQL长度限制,通过设置max_allowed_packet可以修改,默认是1M,测试时修改为8M 。 ##总结
记录下最近在项目中犯下的一个比较大的错误,以后不能再犯了 。以前一直都没有注意到,直到现在真正参与到企业项目中,自己的代码被老大指出错误后才发现自己的错误 。学习了 。 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助 。 |