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+dbfile开发小型留言本
Oct 09 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php去除数组中重复数据
Nov 18 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
PHP排序算法类实例
Jun 17 PHP
php通过文件头判断格式的方法
May 28 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 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 万年历实现代码
2012/10/18 PHP
PHP数据过滤的方法
2013/10/30 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
vue如何引入sass全局变量
2018/06/28 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python 穷举指定长度的密码例子
2020/04/02 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
勤俭节约演讲稿
2014/05/08 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
开学第一周总结
2015/07/16 职场文书
小学语文教师研修日志
2015/11/13 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python