Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man diesen SQL-Einfügungs-PHP-Code optimieren?

Vielen Dank tadman und Hanlet Escaño und Uueerdo und Julie Pelletier und Solarflare für die Hilfe in den Kommentaren.

Ich habe 3 verschiedene Änderungen in meinem PHP-Code mit den Ansätzen vorgenommen, die Sie in den Kommentaren vorgeschlagen haben, dann habe ich die Ergebnisse getestet und hier sind die Testergebnisse.

Das Fazit der 3 Tests: Wie Tadman vorgeschlagen hat, befindet sich der Schlüssel in LOAD DATA INFILE . es hat die Ausführungszeit drastisch auf weniger als 7 Sekunden reduziert, und das sind die 3 Tests.

ORIGINALCODE: ~ 26 Minuten

TEST 1 : ~ 34 Minuten

(als Uueerdo schlug vor, das echo zu entfernen Anweisungen und der Zeilenzähler aus der Schleife)

while(!feof($filehandle)){
// $x++; // commented out
//echo $x . ":  "; // commented out
$fileline = fgets($filehandle);
$fields = explode("\t", $fileline);
$query = "INSERT INTO products(hs,arabicname,englishname) VALUES(" . "'" . str_replace("'", ".", $fields[0]) ."'," . "'". str_replace("'", ".", $fields[1]) . "'," . "'". str_replace("'", ".", $fields[2]) . "');"; 
$result = $conn->query($query); 
/* // commented out
if(!$result) {echo  $conn->error . "</br>";}
}else{echo $result . "</br>";}
*/};

TEST 2 : ~ 7 Sekunden

(Als tadman sagte, ich habe nach LOAD DATA INFILE gesucht und es war super mächtig

//replace the entire loop with this simple query
$query = "LOAD DATA LOCAL INFILE'" . 
addslashes("C:\\xampp\\htdocs\\bots\\impandexp\\imports.txt")
. "' INTO TABLE imports FIELDS TERMINATED BY '\t' LINES TERMINATED BY
'\r\n'(product_hs,counteryname,units,weight,value) SET  year = '2014';";
 $result = $conn->query($query);

TEST 3 : ~ 5 Sekunden

Es war dasselbe wie Test 2, außer dass ich auf derselben Seite wie Tadman nützliche Tipps gefunden habe, die dabei helfen, die Geschwindigkeit zu maximieren.

Massendatenladen für InnoDB-Tabellen

// turning off index checks that might slows down bulk data insertion
$query = "SET foreign_key_checks=0;";
$conn->query($query);
$query = "SET unique_checks=0;";
$conn->query($query);
$query ="SET autocommit=0;";
$conn->query($query);

$query = "LOAD DATA LOCAL INFILE'" . addslashes("C:\\xampp\\htdocs\\bots\\impandexp\\imports.txt") . "' INTO TABLE imports FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'(product_hs,counteryname,units,weight,value) SET  year = '2014';";
$result = $conn->query($query);
echo $result . "</br>";
// turning them on again
$query = "SET foreign_key_checks=1;";
$conn->query($query);
$query = "SET unique_checks=1;";
$conn->query($query);
$query ="COMMIT;";
$conn->query($query);