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之数据库操作详解及乱码解决!
Jan 02 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
phpmyadmin 3.4 空密码登录的实现方法
May 29 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
YII中assets的使用示例
Jul 31 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
tp5.1 框架join方法用法实例分析
May 26 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录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python烟花效果的代码实例
2020/02/25 Python
python实现简单猜单词游戏
2020/12/24 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
金士达面试非笔试
2012/03/14 面试题
浪费资源的建议书
2014/03/12 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
委托公证书样本
2015/01/23 职场文书
公司转让协议书
2016/03/19 职场文书