Mysql
 sql >> Base de données >  >> RDS >> Mysql

comment optimiser ce code php d'insertion sql ?

Merci beaucoup tadman et Hanlet Escaño et Uueerdo et Julie Pelletier et Solarflare pour m'avoir aidé dans les commentaires.

J'ai fait 3 changements différents dans mon code PHP en utilisant les approches que vous avez suggérées dans les commentaires, puis j'ai testé les résultats et voici les résultats des tests.

La conclusion des 3 tests : comme tadman l'a suggéré, la clé est dans LOAD DATA INFILE . il a considérablement réduit le temps d'exécution à moins de 7 secondes, et ce sont les 3 tests.

CODE D'ORIGINE : ~ 26 min

ESSAI 1 : ~ 34 min

(comme Uueerdo suggéré que j'ai supprimé le echo instructions et le compteur de lignes de la boucle)

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>";}
*/};

ESSAI 2 : ~ 7 secondes

(En tant que tadman dit que j'ai cherché LOAD DATA INFILE et c'était super puissant

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

ESSAI 3 : ~ 5 secondes

C'était la même chose que le test 2 sauf que j'ai trouvé des conseils utiles sur la même page que tadman donne, qui aident à maximiser la vitesse pour.

Chargement de données en masse pour les tables InnoDB

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