Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

como otimizar este código php de inserção sql?


Muito obrigado tadman e Hanlet Escaño e Uueerdo e Julie Pelletier e Solarflare por me ajudar nos comentários.

Fiz 3 alterações diferentes no meu código PHP usando as abordagens que você sugeriu nos comentários, depois testei os resultados e aqui estão os resultados dos testes.

A conclusão dos 3 testes: como tadman sugeriu, a chave está em LOAD DATA INFILE . reduziu drasticamente o tempo de execução para menos de 7 segundos, e esses são os 3 testes.

CÓDIGO ORIGINAL: ~ 26 minutos



TESTE 1: ~ 34 minutos



(como Uueerdo sugeriu que eu removesse o echo instruções e o contador de linhas do loop)
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>";}
*/};

TESTE 2: ~ 7 segundos



(Como tadman disse que procurei por LOAD DATA INFILE e foi super poderoso
//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);

TESTE 3: ~ 5 segundos



Foi o mesmo que o teste 2, exceto que encontrei dicas úteis na mesma página que o tadman dá, que ajudam a maximizar a velocidade.

Carregamento de dados em massa para tabelas 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);