Maison > Article > développement back-end > PHP insère les données par lots dans MySQL (exemple de code)
Supposons que j'ai une telle table et que je souhaite insérer une grande quantité de données dans cette table
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='用户信息表';
Insertion par lots
Méthode 1. Utiliser la boucle for pour insérer
Lors de l'insertion d'une petite quantité de données dans MySQL, nous utilisons généralement la boucle 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();
Si vous souhaitez insérer une grande quantité de données par lots, il n'y a aucun problème si vous utilisez également une boucle for pour l'insérer, mais cela prendra plus de temps. Comparez l'insertion d'une petite quantité de données avec l'insertion d'une grande quantité de données, en utilisant la boucle for ci-dessus pour insérer le temps nécessaire : nombre de fois (unité : secondes)
Méthode 2 : utilisez l'instruction insert pour fusionner et insérer
Dans MySQL, vous pouvez utiliser l'instruction insert pour fusionner et insérer, par exemple as
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();
Jetons un coup d'œil à la comparaison temporelle entre une petite quantité de données et une grande quantité de données. D'après le temps global, on peut voir que l'insertion par fusion permet de gagner beaucoup de temps par rapport à l'insertion de la boucle for à l'instant, et l'effet est évident Nombre de fois (unité : secondes)
.
Si vous pensez que le tableau est trop grand et que vous souhaitez réduire le risque d'erreurs SQL, vous pouvez utilisez également array_chunk pour couper le tableau en morceaux d'une taille spécifiée, puis effectuez une insertion par fusion pour chaque bloc.
Pour plus de connaissances sur PHP, veuillez visiter le tutoriel php !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!