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

PHP PDO wstawia wiele (10000+) tych samych wierszy za pomocą bindParam. Dobra praktyka?

Nie musisz wiązaćParam() podczas każdej iteracji pętli. bindParam() powoduje, że zmienne $v1, $v2 itd. są powiązane przez referencję , więc wszystko, co musisz zrobić, to zmienić wartości tych zmiennych, a następnie ponownie wykonać zapytanie. To może obniżyć koszty ogólne.

Możesz także uniknąć wywoływania intval() za każdym razem, gdy przechodzisz przez pętlę. Tylko upewnij się, że $cloneCount jest sprowadzony do liczby całkowitej raz , przed pętlą. To bardzo niewielka poprawa, ale to dobra praktyka.

$cloneCount = (int) $cloneCount;

... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);

for ($i=0; $i < $cloneCount; $i++) 
{
  $v1 = /* something */
  $v2 = /* something */
  $insertG->execute();
}

Powinieneś także unikać automatycznego zatwierdzania. Zmniejsz obciążenie transakcji MySQL na wykonanie instrukcji przez rozpoczęcie jawnej transakcji , wstawiając kilka tysięcy wierszy, a następnie zatwierdzając transakcję.

Ale najlepszym sposobem na przyspieszenie zbiorczego WSTAWIANIA tysięcy podobnych wierszy do jednej tabeli jest użycie ZAŁADUJ LOKALNY PLIK DANYCH zamiast INSERT. Działa to 10-20 razy szybciej niż INSERT wiersz po wierszu, nawet jeśli używasz parametrów, transakcji, wstawiania wielu wierszy i innych sztuczek, które możesz wymyślić.

Nawet jeśli musisz użyć PHP do zapisania danych w pliku .CSV na dysk, a następnie użyć LOAD DATA LOCAL INFILE na tym pliku, nadal jest to znacznie szybsze.

Zobacz także Szybkość instrukcji INSERT w instrukcji MySQL, aby uzyskać więcej wskazówek.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hasło sklepu jest w porządku w zmiennej sesji php?

  2. zapytanie mysql, aby wybrać wszystko oprócz

  3. Wstaw do MySQL Z innej tabeli

  4. Mysql PDO maksymalna długość danych LONGBLOB podczas pobierania

  5. Nie można użyć mysql_real_escape_string