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利用COM对象访问SQLServer、Access
Oct 09 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
Aug 17 PHP
PHP下escape解码函数的实现方法
Aug 08 PHP
PHP插入排序实现代码
Apr 04 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
PHP输出时间差函数代码
2013/01/28 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
python中对数据进行各种排序的方法
2019/07/02 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
初一生物教学反思
2014/01/18 职场文书
爱我中华教学反思
2014/04/28 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server