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 正则 过滤html 的超链接
Jun 02 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
PHP数组实例总结与说明
Aug 23 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
php三元运算符知识汇总
Jul 02 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
PHP自动载入类文件函数__autoload的使用方法
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
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
javascript call方法使用说明
2010/01/11 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
盘点提高 Python 代码效率的方法
2014/07/03 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
python 生成图形验证码的方法示例
2018/11/11 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
行政主管职责范本
2014/03/07 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
Django实现聊天机器人
2021/05/31 Python
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL