MySQL-Batch-Einfügemethode: 1. Schleifeneinfügung, Syntaxformat „for($i=1;$i<=condition;$i++){//insert Statement}“ 2. Reduzieren Sie Verbindungsressourcen und verbinden Sie eine SQL; 3. Verwenden Sie gespeicherte Prozeduren. 4. Verwenden Sie „MYSQL LOCAL_INFILE“.
Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL-Version 8.0.22, Thinkpad T480-Computer.
MySQL-Methode zum Batch-Einfügen von Daten:
Methode 1: Schleifeneinfügung
Dies ist auch die gebräuchlichste Methode, wenn die Datenmenge nicht sehr groß ist, kann sie verwendet werden, verbraucht jedoch Ressourcen jedes Mal eine Verbindung zur Datenbank herzustellen.
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 Sie 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); } }
Weitere verwandte kostenlose Lerninhalte Empfehlungen:MySQL-Tutorial (Video)
Das obige ist der detaillierte Inhalt vonSo fügen Sie Daten stapelweise in MySQL ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!