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.