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 相关文章推荐
mysql时区问题
Mar 26 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
Jun 29 PHP
php生成短网址示例
May 05 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
php支持断点续传、分块下载的类
May 02 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
php获取linux命令结果的实例
Mar 13 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 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
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
JavaScript WeakMap使用详解
2021/02/05 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
python梯度下降算法的实现
2020/02/24 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
大学社团活动策划书
2014/01/26 职场文书
食品安全检查制度
2014/02/03 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
自查自纠整改报告
2014/11/06 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
安全生产先进个人总结
2015/02/15 职场文书
公司酒会致辞
2015/07/30 职场文书
学校就业保障协议书
2019/06/24 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技