Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP PDO insère plusieurs (10000+) mêmes lignes en utilisant bindParam. Bonnes pratiques?

Vous n'avez pas besoin de bindParam() à chaque itération de la boucle. Le bindParam() provoque la liaison des variables $v1, $v2, etc. par référence , il vous suffit donc de modifier les valeurs de ces variables, puis de réexécuter la requête. Cela pourrait réduire les frais généraux.

Vous pouvez également éviter d'appeler intval() à chaque fois dans la boucle. Assurez-vous simplement que $cloneCount est contraint à un entier une fois , avant la boucle. C'est une amélioration très mineure, mais c'est une bonne pratique.

$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();
}

Vous devez également éviter l'autocommit. Réduisez la surcharge de transaction de MySQL par exécution d'instruction en démarrant une transaction explicite , en insérant plusieurs milliers de lignes, puis en validant la transaction.

Mais la meilleure façon d'accélérer l'INSERT en bloc de milliers de lignes similaires dans une seule table est d'utiliser CHARGER LE FICHIER LOCAL DE DONNÉES au lieu de INSÉRER. Cela s'exécute 10 à 20 fois plus vite que INSERT ligne par ligne, même si vous utilisez des paramètres, des transactions, une insertion multi-lignes et toute autre astuce à laquelle vous pouvez penser.

Même si vous devez utiliser PHP pour écrire vos données dans un fichier .CSV sur le disque, puis utiliser LOAD DATA LOCAL INFILE sur ce fichier, c'est toujours beaucoup plus rapide.

Voir aussi Vitesse des instructions INSERT dans le manuel de MySQL pour plus de conseils.