Heim  >  Artikel  >  Datenbank  >  So geben Sie Daten stapelweise in MySQL ein

So geben Sie Daten stapelweise in MySQL ein

coldplay.xixi
coldplay.xixiOriginal
2021-01-04 17:47:3711427Durchsuche

Methoden für die Batch-Dateneingabe in MySQL: 1. Schleifeneinfügung verwenden; 2. Verbindungsressourcen reduzieren und eine SQL-Anweisung verbinden; 4. [MYSQL LOCAL_INFILE] verwenden;

So geben Sie Daten stapelweise in MySQL ein

Die Betriebsumgebung dieses Tutorials: Windows 7-System, MySQL-Version 8.0.22, DELL G3-Computer. Diese Methode ist für alle Computermarken geeignet.

Verwandte kostenlose Lernempfehlungen: MySQL-Video-Tutorial

MySQL-Batch-Dateneingabemethode:

Methode 1: Schleifeneinfügung

Dies ist auch die gebräuchlichste Methode, wenn die Datenmenge nicht sehr groß ist , Sie können es verwenden, aber die Ressourcen für die Verbindung zur Datenbank werden jedes Mal verbraucht.

Die allgemeine Idee ist wie folgt

(Ich schreibe hier Pseudocode, das spezifische Schreiben kann mit Ihrer eigenen Geschäftslogik oder Framework-Syntax kombiniert werden)

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++
}

Weil es zu häufig und nicht schwierig zugleich ist, und es ist nicht das, was ich heute hauptsächlich schreibe, deshalb werde ich es hier nicht schreiben. Erzähl mir mehr

Methode 2: Verbindungsressourcen reduzieren und eine SQL verbinden

Der Pseudocode lautet wie folgt

//这里假设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

So geschrieben ist es Normalerweise ist es kein großes Problem, 10.000 Artikel einzufügen, es sei denn, die Daten sind sehr lang. Zum Beispiel: Stapelgenerierung von Kartennummern, Stapelgenerierung von Zufallscodes usw. . .

Methode 3: Gespeicherte Prozeduren verwenden

Ich verwende dies zufällig wieder und bezahle einfach die SQL. Sie können die spezifische Geschäftslogik selbst kombinieren.

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();

Dies ist nur ein Testcode.

Ich füge 80.000 Elemente gleichzeitig ein, aber die Datenmenge in jedem Stück ist sehr groß und Textfelder

Es dauert 6,524 s

Methode 4: Verwenden MYSQL LOCAL_INFILE

Ich verwende dies derzeit, also kopiere ich übrigens auch den PDO-Code als Referenz

//设置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);
  }
}

Das hat auch eine große Menge davon Daten in jedem Stück, mit vielen varchar4000- und Textfeldern

Es dauert 2,160 Sekunden

Das Obige erfüllt die Grundanforderungen. 1 Million Daten sind kein großes Problem, sonst sind die Daten zu groß und umfassen Unterdatenbanken und Tabellen oder es wird über eine Warteschlange eingefügt.

Das obige ist der detaillierte Inhalt vonSo geben Sie Daten stapelweise in MySQL ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn