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;
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 = 'insert...............'; //querysql } foreach($arr as $key => $value){ $sql = 'insert...............'; //querysql } while($i <= 100){ $sql = 'insert...............'; //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 = '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
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 = '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); } }
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!