>  기사  >  백엔드 개발  >  PHP는 mysql에 데이터 일괄 삽입을 구현합니다.

PHP는 mysql에 데이터 일괄 삽입을 구현합니다.

王林
王林앞으로
2020-01-31 21:46:484353검색

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='用户信息表';

일괄 삽입

방법 1. for 루프를 사용하여 삽입

mysql에 소량의 데이터를 삽입할 때 일반적으로 for 루프를 사용합니다

(관련 영상 튜토리얼 공유 : php 영상 튜토리얼)

$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();

If 많은 양의 데이터를 일괄적으로 삽입하는 경우 for 루프도 사용하면 문제는 없으나 시간이 더 오래 걸립니다. 적은 양의 데이터를 삽입하는 것과 대량의 데이터를 삽입하는 것을 비교하면 위의 for 루프를 사용하여 삽입하는 데 걸리는 시간: 항목 수 시간(단위: 초)

PHP는 mysql에 데이터 일괄 삽입을 구현합니다.

방법 2. insert 문을 사용하여 병합 the inserts

mysql에서 insert 문을 사용할 수 있습니다.

INSERT INTO user_info (name, age) VALUES (&#39;name1&#39;, 18), (&#39;name2&#39;, 19);表示一次插入两条数据

$arr = [ 
[
&#39;name&#39; => &#39;testname1&#39;,
&#39;age&#39; => 18,
],
[
&#39;name&#39; => &#39;testname2&#39;,
&#39;age&#39; => 19,
],
[
&#39;name&#39; => &#39;testname3&#39;,
&#39;age&#39; => 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 = &#39;( &#39;;
$itemStr .= sprintf("&#39;%s&#39;, %d", $item[&#39;name&#39;], (int)$item[&#39;age&#39;]);
$itemStr .= &#39;),&#39;;
$sql .= $itemStr;
}

// 去除最后一个逗号,并且加上结束分号
$sql = rtrim($sql, &#39;,&#39;);
$sql .= &#39;;&#39;;

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();

와 같이 병합 삽입을 수행하는 분들은 적은 양의 데이터와 대량의 데이터 간의 시간 비교를 살펴보겠습니다. 전체적인 시간으로 보면 지금의 for 루프 삽입에 비해 insert merge 삽입이 시간을 많이 절약해주는 것을 알 수 있고, 항목 수(단위: 초)

PHP는 mysql에 데이터 일괄 삽입을 구현합니다.

생각해보면 배열이 너무 커서 SQL 오류를 줄이려는 경우 위험합니다. array_chunk를 사용하여 배열을 지정된 크기의 청크로 자른 다음 각 청크를 병합하고 삽입할 수도 있습니다.

추천 관련 기사 및 튜토리얼: php 튜토리얼

위 내용은 PHP는 mysql에 데이터 일괄 삽입을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제