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编程网上资源导航
Oct 09 PHP
header()函数使用说明
Nov 23 PHP
推荐一篇入门级的Class文章
Mar 19 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
php无限极分类实现方法分析
Jul 04 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
重置版战役片段
2020/04/09 魔兽争霸
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
js控制web打印(局部打印)方法整理
2013/05/29 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
Python生成8位随机字符串的方法分析
2017/12/05 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
校园十佳歌手策划书
2014/01/22 职场文书
班主任工作经验材料
2014/02/02 职场文书
求职信结尾怎么写
2014/05/26 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
自主招生自荐信范文
2015/03/04 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
详解Python内置模块Collections
2022/03/22 Python