关于PHP往mysql数据库中批量插入数据实例教程
	2019-01-22 15:07
	
互联网
	文章主要给大家介绍了关于php往mysql中批量插入数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
前言
假如说我有这样一个表,我想往这个表里面插入大量数据?
- 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合并插入
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。