Méthode d'insertion de données par lots MySQL : 1. Insertion de boucle, format de syntaxe "for($i=1;$i<=condition;$i++){//insert déclaration}" 2. Réduire les ressources de connexion, épisser un SQL ; 3. Utiliser des procédures stockées ; 4. Utiliser "MYSQL LOCAL_INFILE".
L'environnement d'exploitation de ce tutoriel : système Windows7, mysql version 8.0.22, ordinateur thinkpad t480.
Méthode d'insertion de données par lots MySQL :
Méthode 1 : Insertion de boucle
C'est également la méthode la plus courante, si La quantité de données n'est pas très importante et peut être utilisée, mais les ressources pour se connecter à la base de données seront consommées à chaque fois.
L'idée générale est la suivante
(J'écris du pseudo code ici, l'écriture spécifique peut être combinée avec votre propre logique métier ou syntaxe de framework)
for($i=1;$i<=100;$i++){ $sql = 'insert...............'; //querysql } foreach($arr as $key => $value){ $sql = 'insert...............'; //querysql } while($i <= 100){ $sql = 'insert...............'; //querysql $i++ }
Parce que c'est trop courant et pas difficile à la fois. En même temps, ce n'est pas ce que j'écris principalement aujourd'hui, donc je ne dirai pas grand chose ici
Méthode 2 : Réduire les ressources de connexion et épisser un sql
Le pseudo code est le suivant
//这里假设arr的key和数据库字段同步,其实大多数框架中在php操作数据库的时候都是这么设计的 $arr_keys = array_keys($arr); $sql = 'INSERT INTO tablename (' . implode(',' ,$arr_keys) . ') values'; $arr_values = array_values($arr); $sql .= " ('" . implode("','" ,$arr_values) . "'),"; $sql = substr($sql ,0 ,-1); //拼接之后大概就是 INSERT INTO tablename ('username','password') values ('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx'),('xxx','xxx') ....... //querysql
Ce n'est pas un gros problème d'insérer 10 000 éléments normalement s'ils sont écrits comme ça. À moins que les données ne soient très longues, il suffit de le faire. gérer l'insertion par lots ordinaire, telle que : la génération par lots de numéros de carte, la génération par lots de codes aléatoires, etc.
Méthode 3 : Utiliser des procédures stockées
Il se trouve que je l'utilise à nouveau et que je paie simplement le SQL. Vous pouvez combiner vous-même la logique métier spécifique.
delimiter $$$ create procedure zqtest() begin declare i int default 0; set i=0; start transaction; while i<80000 do //your insert sql set i=i+1; end while; commit; end $$$ delimiter; call zqtest();
Ceci n'est qu'un code de test. Vous pouvez définir vous-même les paramètres spécifiques
J'insère 80 000 éléments à la fois, bien que ce ne soit pas beaucoup, la quantité de données dans chaque pièce. est grand, et il y a beaucoup de varchar4000 et de champs de texte
prend 6,524 s
Méthode 4 : utiliser MYSQL LOCAL_INFILE
C'est ce que je suis actuellement en utilisant, donc au fait, j'ai aussi mis le code pdo Postez-le pour votre référence
//设置pdo开启MYSQL_ATTR_LOCAL_INFILE /*hs96.cn@gmail.com public function pdo_local_info () { global $system_dbserver; $dbname = 'hs96.cn@gmail.com'; $ip = 'hs96.cn@gmail.com'; $user = 'hs96.cn@gmail.com'; $pwd = 'hs96.cn@gmail.com'; $dsn = 'mysql:dbname=' . $dbname . ';host=' . $ip . ';port=3306'; $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true]; $db = new PDO($dsn ,$user ,$pwd ,$options); return $db; } //伪代码如下 public function test(){ $arr_keys = array_keys($arr); $root_dir = $_SERVER["DOCUMENT_ROOT"] . '/'; $my_file = $root_dir . "hs96.cn@gmail.com/sql_cache/" . $order['OrderNo'] . '.sql'; $fhandler = fopen($my_file,'a+'); if ($fhandler) { $sql = implode("\t" ,$arr); $i = 1; while ($i <= 80000) { $i++; fwrite($fhandler ,$sql . "\r\n"); } $sql = "LOAD DATA local INFILE '" . $myFile . "' INTO TABLE "; $sql .= "tablename (" . implode(',' ,$arr_keys) . ")"; $pdo = $this->pdo_local_info (); $res = $pdo->exec($sql); if (!$res) { //TODO 插入失败 } @unlink($my_file); } }
Plus de recommandations d'apprentissage gratuites connexes : tutoriel mysql(vidéo)
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!