关于PHP往mysql数据库中批量插入数据实例教程
2019-01-22 15:07:51
来源:
互联网
文章主要给大家介绍了关于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合并插入
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。