이런 테이블이 있는데 어떻게 이 테이블에 많은 양의 데이터를 삽입할 수 있을까요?
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 루프를 사용하여 삽입하는 데 걸리는 시간: 항목 수 시간(단위: 초)
방법 2. insert 문을 사용하여 병합 the inserts
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();
와 같이 병합 삽입을 수행하는 분들은 적은 양의 데이터와 대량의 데이터 간의 시간 비교를 살펴보겠습니다. 전체적인 시간으로 보면 지금의 for 루프 삽입에 비해 insert merge 삽입이 시간을 많이 절약해주는 것을 알 수 있고, 항목 수(단위: 초)
생각해보면 배열이 너무 커서 SQL 오류를 줄이려는 경우 위험합니다. array_chunk를 사용하여 배열을 지정된 크기의 청크로 자른 다음 각 청크를 병합하고 삽입할 수도 있습니다.
추천 관련 기사 및 튜토리얼: php 튜토리얼
위 내용은 PHP는 mysql에 데이터 일괄 삽입을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!