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 url路由入门实例
Apr 23 PHP
PHP面向对象精要总结
Nov 07 PHP
php实现转换ubb代码的方法
Jun 18 PHP
PHP中iconv函数知识汇总
Jul 02 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
apache和PHP如何整合在一起
Oct 12 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
PHP给文字内容中的关键字进行套红处理
Apr 12 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 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
php 一元分词算法
2009/11/30 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
如何在PHP中使用数组
2020/06/09 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
vue动态路由实现多级嵌套面包屑的思路与方法
2017/08/16 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
MySQL最常见的操作语句小结
2015/05/07 Python
Python中如何获取类属性的列表
2016/12/26 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
Numpy之random函数使用学习
2019/01/29 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
django配置app中的静态文件步骤
2020/03/27 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
办公室文员工作自我评价
2013/12/01 职场文书
酒店总经理助理职责
2014/02/12 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android