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


Posted in PHP onApril 23, 2020

本文实例讲述了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 相关文章推荐
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
php smarty模板引擎的6个小技巧
Apr 24 PHP
PHP小教程之实现链表
Jun 09 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
2014最热门的24个php类库汇总
Dec 18 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 #PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 #PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 #PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 #PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 23 #PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 #PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 #PHP
You might like
如何做到多笔资料的同步
2006/10/09 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
php实现加减法验证码代码
2014/02/14 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
django允许外部访问的实例讲解
2018/05/14 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
python绘制高斯曲线
2021/02/19 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
高中生学习的自我评价
2013/12/14 职场文书
人事专员工作职责
2014/02/22 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
应届大专生求职信
2014/06/26 职场文书
工作失职检讨书500字
2014/10/17 职场文书
房贷收入证明范本
2015/06/12 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
python游戏开发之pygame实现接球小游戏
2022/04/22 Python