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中调用ASP.NET的WebService的代码
Apr 22 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
Apr 22 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
PHP借助phpmailer发送邮件
May 11 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
PHP架构及原理知识点详解
Dec 22 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实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php实现微信支付之企业付款
2018/05/30 PHP
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
浅谈python迭代器
2017/11/08 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
django如何通过类视图使用装饰器
2019/07/24 Python
python实现的生成word文档功能示例
2019/08/23 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
python实现马丁策略的实例详解
2021/01/15 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
百度吧主申请感言
2014/01/12 职场文书
化工操作工岗位职责
2014/04/29 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
布达拉宫导游词
2015/02/02 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
国情备忘录观后感
2015/06/04 职场文书
《落花生》教学反思
2016/02/16 职场文书