Maison > Article > développement back-end > PHP implémente l'insertion par lots de données dans MySQL
Maintenant, il existe un tel tableau. Comment pouvons-nous insérer une grande quantité de données dans ce tableau ?
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
(Partage de tutoriel vidéo associé : tutoriel vidéo 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();
Si vous souhaitez insérer une grande quantité de données par lots, il n'y a pas de problème si vous utilisez également une boucle for pour 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, le temps nécessaire à l'insertion à l'aide de la boucle for ci-dessus : Nombre d'éléments, temps (unité : secondes)
Méthode 2. Utilisez l'instruction insert pour fusionner Insert
Dans MySQL, vous pouvez utiliser l'instruction insert pour l'insertion par fusion, telle que
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 par insertion fait gagner beaucoup de temps par rapport à l'insertion de la boucle for à l'instant, et l'effet est évident Nombre d'éléments (unité : secondes)
.
Si vous pensez que le tableau est trop grand, si vous souhaitez réduire le risque d'erreurs SQL, vous pouvez également utiliser array_chunk pour couper le tableau en blocs d'une taille spécifiée, puis fusionner et insérer chaque bloc. .
Articles et tutoriels connexes recommandés : 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!