设计一个数据表如下:

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优化之批量操作MySQL的更多相关文章

  1. 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

  2. MySQL优化---DBA对MySQL优化的一些总结

      非原创, 来自梦嘉朋友, 非常好的总结, 一起学习. ------------------------------------------------- 1. 要确保有足够的内存数据库能够高效的运 ...

  3. lnmp全面优化集合nginx+mysql+php

    lnmp的全名是linux+nginx+mysql+php,既然是全面优化那我们就从linux系统的选择入手.debian系统可以算是 linux各分支中做的比较突出的一类,连谷歌都抛弃linux订制 ...

  4. mysql常见优化,更多mysql,Redis,memcached等文章

    mysql常见优化 http://www.cnblogs.com/ggjucheng/archive/2012/11/07/2758058.html 更多mysql,Redis,memcached等文 ...

  5. 通过查看mysql 配置参数、状态来优化你的mysql

    mysql的监控方法大致分为两类: 1.连接到mysql数据库内部,使用show status,show variables,flush status 来查看mysql的各种性能指标. 2. 直接使用 ...

  6. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  7. 深度优化LNMP之MySQL

    MySQL数据库优化框架体系 1.硬件层面优化 2.操作系统层面优化 3.MySQL数据库层面优化 4.MySQL安全优化 5.网站集群架构上的优化 6.MySQL流程.制度控制优化 1 硬件层面优化 ...

  8. mysql 通过查看mysql 配置参数、状态来优化你的mysql

    我把MYISAM改成了INNODB,数据库对CPU方面的占用变小很多' mysql的监控方法大致分为两类: 1.连接到mysql数据库内部,使用show status,show variables,f ...

  9. [转]通过查看mysql 配置参数、状态来优化你的mysql

    From : http://wangwei007.blog.51cto.com/68019/967278 mysql的监控方法大致分为两类: 1.连接到mysql数据库内部,使用show status ...

随机推荐

  1. CAD 安装时出现.net frameword 3.5安装不上的问题

    右击---我的电脑---功能---.net framework 3.5 ---勾选---安装,然后再进行安装CAD即可

  2. Windows7环境下Apache连接MySQL提示“连接已重置”的解决办法

    win7下手动搭建wamp环境,碰到的几个坑总结下, 1.能正常访问php和html类型文件,但是访问项目文件时老是连接被重置,后来总结是数据库的问题,就写测试用例测试php能否成功调用数据库, &l ...

  3. Django中对单表的增删改查

    之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.creat ...

  4. python经典一百道习题(转自奶酪博客)

    无论学习哪门计算机语言,只要把100例中绝大部分题目都做一遍,就基本掌握该语言的语法了. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #Filena ...

  5. Spring MVC系列[2]——参数传递及重定向

    1.目录结构 2.代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  6. Linux远程连接及常用指令

    一.远程连接 一般,服务器都是特别庞大的,会把它们用一个独立的小屋进行存放,如果有时候需要对服务器进行一些操作,离得近还好,离的远就会破费一些周折了,所以,这个时候我们就需要用到远程连接软件了.推荐使 ...

  7. LeetCode 3Sum Closest 最近似的3sum(2sum方法)

    题意:找到最接近target的3个元素之和,并返回该和. 思路:用2个指针,时间复杂度O(n^2). int threeSumClosest(vector<int>& nums, ...

  8. codevs 2277 爱吃皮蛋的小明(水题日常)

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题目描述 Description 小明特别爱吃蛋,特别是皮蛋.他一次可以吃一个蛋或者两个蛋(整个吞下去),而且他 ...

  9. Make 学习笔记(1)

    Make 学习笔记(1) 参考: GNU make 学习总结(1) 基础 make是帮助程序员使编译器明白如何编译工程的一种工具; 核心是规则. 规则一般由三部分组成: 目标(target) 必要条件 ...

  10. webStorm Ctrl+s 自动格式化 然后 保存 用宏命令

    使用WebStorm的Macros宏指令,实现保存的同时格式化代码,并跳至行尾 https://blog.csdn.net/gyz718/article/details/70556188