• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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语句,然后再断开。这就是第一段代码最主要的时间开销–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程序设计有所帮助。

    您可能感兴趣的文章:
    • 浅谈PHP性能优化之php.ini配置
    • 详解PHP优化巨量关键词的匹配
    • PHP引擎php.ini参数优化深入讲解
    • php优化查询foreach代码实例讲解
    • PHP安全配置优化详解
    • PHP内存溢出优化代码详解
    • PHP优化教程之解决嵌套问题
    • PHP解决高并发的优化方案实例
    • 如何使用PHP对象POPO来优化你的代码
    上一篇:Thinkphp 框架扩展之Widget扩展实现方法分析
    下一篇:PHP过滤器 filter_has_var() 函数用法实例分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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