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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
PHP如何透过ODBC来存取数据库
Oct 09 PHP
php 获取远程网页内容的函数
Sep 08 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php如何调用webservice应用介绍
Nov 24 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
js右键菜单效果代码
2007/07/21 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
JS实现为排序好的字符串找出重复行的方法
2016/03/02 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
详解webpack的clean-webpack-plugin插件报错
2020/10/16 Javascript
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
python生成ppt的方法
2018/06/07 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
如何验证python安装成功
2020/07/06 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
Python是如何进行类型转换的
2013/06/09 面试题
日语翻译个人求职的自我评价
2013/10/14 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
爱晚亭导游词
2015/02/09 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript