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正则表达式(regar expression)
Sep 10 PHP
第四章 php数学运算
Dec 30 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
深入php list()函数的详解
Jun 05 PHP
thinkphp 多表 事务详解
Jun 17 PHP
php反射应用示例
Feb 25 PHP
一组PHP加密解密函数分享
Jun 05 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
php从memcache读取数据再批量写入mysql的方法
Dec 29 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP数据库处理封装类实例
Dec 24 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中使用Oracle数据库(5)
2006/10/09 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
使用Bootstrap打造特色进度条效果
2017/05/02 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python 求10个数的平均数实例
2019/12/16 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
中学教师请假制度
2014/02/03 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
委托证明范本
2014/11/25 职场文书
幼儿学前班评语
2014/12/29 职场文书
安阳殷墟导游词
2015/02/10 职场文书
运动会主持人开幕词
2016/03/04 职场文书