Mysql
 sql >> Baza danych >  >> RDS >> Mysql

jak zoptymalizować ten kod php wstawiania sql?

Dziękuję bardzo tadman i Hanlet Escaño i Uueerdo i Julie Pelletier i Solarflare za pomoc w komentarzach.

Zrobiłem 3 różne zmiany w moim kodzie PHP, korzystając z podejść, które zasugerowałeś w komentarzach, następnie przetestowałem wyniki i oto wyniki testów.

Zakończenie 3 testów: jak zasugerował tadman, klucz znajduje się w LOAD DATA INFILE . radykalnie skróciło czas wykonania do mniej niż 7 sekund, a to są 3 testy.

KOD ORYGINALNY: ~ 26 minut

TEST 1: ~ 34 minuty

(jako Uueerdo zasugerowałem, że usunąłem echo instrukcji i licznika wierszy z pętli)

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 sekund

(Jako tadman powiedział, że szukałem LOAD DATA INFILE i był super potężny

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

To było tak samo jak w teście 2, z tą różnicą, że na tej samej stronie, którą podaje tadman, znalazłem przydatne wskazówki, które pomagają w maksymalizacji prędkości.

Zbiorcze ładowanie danych dla tabel 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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać zliczone wartości z separatorem przecinków jako wartość pojedynczego wiersza?

  2. Załaduj plik danych MySQL po spełnieniu warunków

  3. Wyszukiwanie pełnotekstowe MySQL w wielu kolumnach:zamieszanie w wynikach

  4. Pobieranie i wyświetlanie obrazów BLOB z bazy danych Mysql za pomocą Tkinter

  5. Czy ta lokalna dla wątku sesja Flask-SQLAchemy powoduje błąd serwera MySQL?