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获取网络上文件
Oct 09 PHP
PHP自定义函数收代码
Aug 01 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
Linux下php5.4启动脚本
Aug 03 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
php车辆违章查询数据示例
Oct 14 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
Dec 24 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
php实现websocket实时消息推送
Mar 30 PHP
Laravel数据库读写分离配置的方法
Oct 13 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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调用三种数据库的方法(1)
2006/10/09 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python基础教程之常用运算符
2014/08/29 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python递归函数定义与用法示例
2017/06/02 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python+opencv实现阈值分割
2018/12/26 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
制作部班长职位说明书
2014/02/26 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
nginx访问报403错误的几种情况详解
2022/07/23 Servers