PHP优化之批量操作MySQL实例分析

吾爱主题 阅读:165 2021-10-11 14:43:00 评论:0

本文实例讲述了PHP优化之批量操作MySQL。分享给大家供大家参考,具体如下:

设计一个数据表如下:

?
1 2 3 4 5 create table optimization(    id INT NOT NULL AUTO_INCREMENT,    value VARCHAR (10) NOT NULL ,    PRIMARY KEY (id) );

现在有一个业务需求需要批量插入数据。

先来看看下面这一段代码:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?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

再来看看第二段代码:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <?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语句,然后再断开。这就是第一段代码最主要的时间开销–PHP与MySQL连接的网络传输IO
  • 第一段代码SQL语句解析的次数更多

因此,在第二段代码中,通过合并SQL语句来实现减少SQL语句解析的次数以及PHP与MySQL连接的次数来达到减少网络传输IO的开销。

注意: 1、SQL语句是有长度限制的,因此,在进行SQL语句合并时务必不能超过SQL长度限制,通过设置max_allowed_packet可以修改,默认是1M,测试时修改为8M。

##总结

在进行对数据库的批量操作(如:插入、更新、修改)时,应当尽可能将SQL语句合并后再执行而不是在循环中依次执行。

记录下最近在项目中犯下的一个比较大的错误,以后不能再犯了。以前一直都没有注意到,直到现在真正参与到企业项目中,自己的代码被老大指出错误后才发现自己的错误。学习了。

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/ryanzheng/p/8317978.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容