Mysql
 sql >> Database >  >> RDS >> Mysql

PHP PDO inserisce più (10000+) righe stesse usando bindParam. Buona pratica?

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.