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
PHP6 先修班 JSON实例代码
Aug 23 PHP
PHP Document 代码注释规范
Apr 13 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
php实现模拟post请求用法实例
Jul 11 PHP
php自动识别文字编码并转换为目标编码的方法
Aug 08 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
Yii2框架中一些折磨人的坑
Dec 15 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP脚本的10个技巧(3)
2006/10/09 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
php实现的双色球算法示例
2017/06/20 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
js实现随机点名功能
2020/12/23 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python 提取文件的小程序
2009/07/29 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
python实现画圆功能
2018/01/25 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
文明风采获奖感言
2014/02/18 职场文书
Python多线程 Queue 模块常见用法
2021/07/04 Python
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL