Non è necessario bindParam() durante ogni iterazione del ciclo. bindParam() fa sì che le variabili $v1, $v2, ecc. vengano vincolate per riferimento , quindi tutto ciò che devi fare è modificare i valori di queste variabili e quindi eseguire nuovamente la query. Ciò potrebbe ridurre le spese generali.
Inoltre puoi evitare di chiamare intval() ogni volta nel ciclo. Assicurati solo che $cloneCount sia forzato a un intero una volta , prima del ciclo. Questo è un piccolo miglioramento, ma è una buona pratica.
$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();
}
Dovresti anche evitare l'autocommit. Riduci il sovraccarico di transazione di MySQL per l'esecuzione di istruzioni avviando una transazione esplicita , inserendo diverse migliaia di righe e quindi confermando la transazione.
Ma il modo migliore per velocizzare l'INSERT in blocco di migliaia di righe simili in una singola tabella è utilizzare CARICA FILE LOCALE DATI invece di INSERIRE. Questo è 10-20 volte più veloce di INSERT riga per riga, anche se usi parametri, transazioni, inserimento multi-riga e qualsiasi altro trucco ti venga in mente.
Anche se devi usare PHP per scrivere i tuoi dati in un file .CSV su disco e poi usare LOAD DATA LOCAL INFILE su quel file, è comunque molto più veloce.
Vedi anche Velocità delle dichiarazioni INSERT nel manuale MySQL per ulteriori suggerimenti.