sql >> Database teknologi >  >> RDS >> Mysql

hvordan man optimerer denne sql indsættelse php kode?

Mange tak tadman og Hanlet Escaño og Uuerdo og Julie Pelletier og Solarflare for at hjælpe mig i kommentarerne.

Jeg lavede 3 forskellige ændringer i min PHP-kode ved at bruge de metoder, du foreslog i kommentarerne, derefter testede jeg resultaterne, og her er testresultaterne.

Konklusionen på de 3 tests: som tadman foreslog, er nøglen i INDLÆS DATAINFIL . det reducerede udførelsestiden dramatisk til mindre end 7 sekunder, og disse er de 3 tests.

ORIGINAL KODE: ~ 26 minutter

TEST 1 : ~ 34 minutter

(som Uuerdo foreslog, at jeg fjernede echo sætninger og rækketælleren fra løkken)

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 sagde, at jeg søgte efter INDLÆS DATAINFIL og det var super kraftfuldt

//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 det samme som test 2, bortset fra at jeg fandt nyttige tips på den samme side, som tadman giver, som hjælper med at maksimere hastigheden til.

Masseindlæsning af data til 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. Postgres tilføjer eller indstiller hvert element (hvis det ikke findes) i en matrix til en matrixkolonne

  2. Sådan søger du i en SQL-tabel efter en sætning

  3. SQL Server - find n'te forekomst i en streng

  4. Samme maven med forskellig adfærd