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使用curl存储cookie的示例
Mar 31 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 PHP
php实现高效获取图片尺寸的方法
Dec 12 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
使用 PHPStorm 开发 Laravel
Mar 24 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 PHP
基于PHP实现发微博动态代码实例
Dec 11 PHP
PHP高并发和大流量解决方案整理
Mar 09 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中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
PHP7 新增常量
2021/03/09 PHP
js中for in语句的用法讲解
2015/04/24 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
餐饮商业计划书范文
2014/04/29 职场文书
药品营销策划方案
2014/06/15 职场文书
企业挂职心得体会
2014/09/10 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
诚信承诺书
2015/01/19 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
张丽莉观后感
2015/06/16 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
详解nginx location指令
2022/01/18 Servers