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

 更新时间:2020年04月23日 11:15:49   作者:Ryan_zheng  
这篇文章主要介绍了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';

经过测试,上面代码运行结果如下:

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自动识别字符集并完成转码详解

    话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。需要的朋友可以过来参考下
    2013-08-08
  • 如何使用FireFox插件FirePHP调试PHP

    如何使用FireFox插件FirePHP调试PHP

    使用这个工具,首先你需要安装FirePHP插件。这个插件需要你已经安装FireBug。装好FirePHP之后,重新打开Firebug面板时候,你会看到新加了一个蓝色的臭虫图标。点击这个图标会出现一个开启或者关闭FirePHP的菜单
    2013-07-07
  • PHP校验ISBN码的函数代码

    PHP校验ISBN码的函数代码

    最近在编写一个图书管理程序的时候,需要校验图书ISBN码正确性,查了一些资料,了解了图书ISBN码的构成。
    2011-01-01
  • PHP内存缓存Memcached类实例

    PHP内存缓存Memcached类实例

    这篇文章主要介绍了PHP内存缓存Memcached类,以实例形式分析了PHP内存缓存Memcached的实现方法,是php操作memcached的典型应用,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • 对PHP PDO的一些认识小结

    对PHP PDO的一些认识小结

    这篇文章主要介绍了对PHP PDO的一些认识小结,本文讲解了什么是PDO、启用PDO的配置方法、PDO的预定义类、事务处理例子等内容,需要的朋友可以参考下
    2015-01-01
  • php str_replace的替换漏洞

    php str_replace的替换漏洞

    php 的函数str_replace替换漏洞
    2008-03-03
  • PHP使用GETDATE获取当前日期时间作为一个关联数组的方法

    PHP使用GETDATE获取当前日期时间作为一个关联数组的方法

    这篇文章主要介绍了PHP使用GETDATE获取当前日期时间作为一个关联数组的方法,实例分析了php中GETDATE函数使用技巧,需要的朋友可以参考下
    2015-03-03
  • thinkphp5使用bootstrapvalidator进行异步验证邮箱的示例

    thinkphp5使用bootstrapvalidator进行异步验证邮箱的示例

    这篇文章主要介绍了thinkphp5使用bootstrapvalidator进行异步验证邮箱的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • PHP接口继承及接口多继承原理与实现方法详解

    PHP接口继承及接口多继承原理与实现方法详解

    这篇文章主要介绍了PHP接口继承及接口多继承原理与实现方法,简单描述了接口继承与多接口继承的概念、原理,并结合实例形式给出了php接口继承的具体实现与使用等操作技巧,需要的朋友可以参考下
    2017-10-10
  • 一个经典实用的PHP图像处理类分享

    一个经典实用的PHP图像处理类分享

    这篇文章主要介绍了一个经典实用的PHP图像处理类分享,本文提供的PHP图像操作类可以满足网站中的大部分功能需求,如图片的缩放、加水印和裁剪等功能,需要的朋友可以参考下
    2014-11-11

最新评论