Maison  >  Article  >  base de données  >  Comment saisir des données par lots dans MySQL

Comment saisir des données par lots dans MySQL

coldplay.xixi
coldplay.xixioriginal
2021-01-04 17:47:3711509parcourir

Méthode de saisie de données par lots MySQL : 1. Utilisez l'insertion de boucle ; 2. Réduisez les ressources de connexion et épissez un SQL ; 3. Utilisez des procédures stockées ;

Comment saisir des données par lots dans MySQL

L'environnement d'exploitation de ce tutoriel : système Windows 7, mysql version 8.0.22, ordinateur DELL G3. Cette méthode convient à toutes les marques d'ordinateurs.

Recommandations d'apprentissage gratuites associées : Tutoriel vidéo MySQL

Méthode de saisie 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, elle peut être utilisée, mais elle consommera à chaque fois les ressources de connexion à la base de données.

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 = &#39;insert...............&#39;;
 //querysql
}
foreach($arr as $key => $value){
$sql = &#39;insert...............&#39;;
 //querysql
}
while($i <= 100){
$sql = &#39;insert...............&#39;;
 //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    = &#39;INSERT INTO tablename (&#39; . implode(&#39;,&#39; ,$arr_keys) . &#39;) values&#39;;
$arr_values  = array_values($arr);
$sql    .= " (&#39;" . implode("&#39;,&#39;" ,$arr_values) . "&#39;),";
$sql    = substr($sql ,0 ,-1);
//拼接之后大概就是 INSERT INTO tablename (&#39;username&#39;,&#39;password&#39;) values
(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;)
.......
//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 utilisé, alors au fait, mettez le code pdo Également reproduit pour votre référence

//设置pdo开启MYSQL_ATTR_LOCAL_INFILE
/*hs96.cn@gmail.com
public function pdo_local_info ()
{
  global $system_dbserver;
  $dbname = &#39;hs96.cn@gmail.com&#39;;
  $ip  = &#39;hs96.cn@gmail.com&#39;;
  $user = &#39;hs96.cn@gmail.com&#39;;
  $pwd  = &#39;hs96.cn@gmail.com&#39;;
  $dsn  = &#39;mysql:dbname=&#39; . $dbname . &#39;;host=&#39; . $ip . &#39;;port=3306&#39;;
  $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"] . &#39;/&#39;;
  $my_file   = $root_dir . "hs96.cn@gmail.com/sql_cache/" . $order[&#39;OrderNo&#39;] . &#39;.sql&#39;;
  $fhandler   = fopen($my_file,&#39;a+&#39;);
  if ($fhandler) {
  $sql = implode("\t" ,$arr);
   $i = 1;
   while ($i <= 80000)
   {
    $i++;
    fwrite($fhandler ,$sql . "\r\n");
   }
   $sql = "LOAD DATA local INFILE &#39;" . $myFile . "&#39; INTO TABLE ";
   $sql .= "tablename (" . implode(&#39;,&#39; ,$arr_keys) . ")";
   $pdo = $this->pdo_local_info ();
   $res = $pdo->exec($sql);
   if (!$res) {
    //TODO 插入失败
   }
   @unlink($my_file);
  }
}

Chaque élément de données est également très volumineux, avec de nombreux varchar4000 et champs de texte

Cela prend 2,160 s

ou plus pour répondre aux besoins de base , 1 million de données n'est pas un gros problème, sinon les données sont trop volumineuses et impliquent des sous-bases de données et des tables, ou une file d'attente est utilisée pour l'insertion.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn