php往mysql中批量插入数据实例教程


Posted in PHP onDecember 12, 2018

前言

假如说我有这样一个表,我想往这个表里面插入大量数据

CREATE TABLE IF NOT EXISTS `user_info` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
 `name` varchar(255) NOT NULL default '' COMMENT '姓名',
 `age` int(11) NOT NULL default '0' COMMENT '年龄',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

批量插入

方法一、使用for循环插入

在往mysql插入少量数据的时候,我们一般用for循环

$arr = [	
	[
		'name' => 'testname1',
		'age' => 18,
	],
	[
		'name' => 'testname2',
		'age' => 19,
	],
	[
		'name' => 'testname3',
		'age' => 18,
	],
];

$servername = "localhost";
$port = 3306;
$username = "username";
$password = "password";
$dbname = "mytestdb";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname, $port);

// 检测连接
if ($conn->connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

$costBegin = microtime(true);

foreach($arr as $item) {
 	$sql = sprintf("INSERT INTO user_info (name, age) VALUES ( '%s', %d);", $item['name'], (int)$item['age']);	 
	if ($conn->query($sql) === TRUE) {
	 echo "insert success";
	} else {
	 echo "Error: " . $sql . "<br>" . $conn->error;
	}
}

$costEnd = microtime(true);
$cost = round($costEnd - $costBegin, 3);
var_dump($cost);

$conn->close();

假如说要批量插入大量数据,如果还用for循环的办法插入是没有问题的,只是时间会比较长。

对比一下插入少量数据与插入大量数据,使用上面的for循环插入耗费的时间:

条数 时间 (单位:秒)
10 0.011
1000 0.585
10000 5.733
100000 60.587

方法二、使用insert语句合并插入

mysql里面是可以使用insert语句进行合并插入的,比如

INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);表示一次插入两条数据

下面看示例代码,看看不同数据条数下

$arr = [	
	[
		'name' => 'testname1',
		'age' => 18,
	],
	[
		'name' => 'testname2',
		'age' => 19,
	],
	[
		'name' => 'testname3',
		'age' => 18,
	],
	// 此处省略
	……
	……
];

$servername = "localhost";
$port = 3306;
$username = "username";
$password = "password";
$dbname = "mytestdb";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname, $port);

// 检测连接
if ($conn->connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

$costBegin = microtime(true);

if (!empty($arr)) {
	$sql = sprintf("INSERT INTO user_info (name, age) VALUES ");

	foreach($arr as $item) {
  $itemStr = '( ';
  $itemStr .= sprintf("'%s', %d", $item['name'], (int)$item['age']);
  $itemStr .= '),';
  $sql .= $itemStr;
  }

 // 去除最后一个逗号,并且加上结束分号
 $sql = rtrim($sql, ',');
 $sql .= ';';

	if ($conn->query($sql) === TRUE) {
	} else {
	 echo "Error: " . $sql . "<br>" . $conn->error;
	}
}

$costEnd = microtime(true);
$cost = round($costEnd - $costBegin, 3);
var_dump($cost);

$conn->close();

下面看一下少量数据与大量数据的时间对比。从总体时间上,可以看出insert合并插入比刚才for循环插入节约了很多时间

条数 时间 (单位:秒)
10 0.006
1000 0.025
10000 0.131
100000 1.23

当然,如果你觉得数组太大,想要减少sql错误的风险,也可以使用array_chunk将数组切成指定大小的块,然后对每个块进行insert合并插入

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php 删除cookie和浏览器重定向
Mar 16 PHP
php中获取远程客户端的真实ip地址的方法
Aug 03 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
PHP排序算法类实例
Jun 17 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
yii2 url重写并隐藏index.php方法
Dec 10 #PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 #PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 #PHP
PHP聊天室简单实现方法详解
Dec 08 #PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 #PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 #PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
You might like
php读取文件内容的方法汇总
2015/01/24 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
js实现楼层导航功能
2017/02/23 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
详解webpack打包时排除其中一个css、js文件或单独打包一个css、js文件(两种方法)
2018/10/26 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python完全新手教程
2007/02/08 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Python读取word文本操作详解
2018/01/22 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
python如何调用百度识图api
2020/09/29 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
护士实习生自我鉴定范文
2013/12/10 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
出生证明范本
2015/06/15 职场文书
预备党员表决心的话
2015/09/22 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Java基础-封装和继承
2021/07/02 Java/Android