sql >> Databasteknik >  >> RDS >> Mysql

hur man optimerar denna sql infogning php-kod?

Tack så mycket tadman och Hanlet Escaño och Uuerdo och Julie Pelletier och Solarflare för att du hjälpte mig i kommentarerna.

Jag gjorde tre olika ändringar i min PHP-kod med hjälp av metoderna du föreslog i kommentarerna, sedan testade jag resultaten och här är testresultaten.

Slutsatsen av de tre testerna: som tadman föreslog finns nyckeln i LADDA DATAINFIL a> . det minskade dramatiskt körtiden till mindre än 7 sekunder, och det här är de 3 testerna.

ORIGINAL KOD: ~ 26 minuter

TEST 1 : ~ 34 minuter

(som Uuerdo föreslog att jag tog bort echo satser och radräknaren från loopen)

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 sekunder

(Som tadman sa att jag sökte efter LOAD DATA INFILE och det var superkraftigt

//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 sekunder

Det var samma som test 2 förutom att jag hittade användbara tips på samma sida som tadman ger, som hjälper till att maximera hastigheten för.

Massdataladdning för InnoDB-tabeller

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



  1. Hur hämtar jag alla rader i min DB?

  2. Är FCM (firebase cloud messaging) Token för en enhet eller för ett konto?

  3. Inga data hittades eller för många rader undantagsfel inträffade under masspostinsättning

  4. fel nummer eller typer av argument vid anrop av lagrad proc