sql >> Database >  >> RDS >> Mysql

PHP PDO voegt meerdere (10000+) dezelfde rijen in met behulp van bindParam. Goede praktijk?

U hoeft Param() niet te binden tijdens elke iteratie van de lus. De bindParam() zorgt ervoor dat de variabelen $v1, $v2, etc. door verwijzing worden gebonden , dus u hoeft alleen maar de waarden van deze variabelen te wijzigen en de query vervolgens opnieuw uit te voeren. Dat zou de overhead kunnen verminderen.

U kunt ook voorkomen dat intval() elke keer door de lus wordt aangeroepen. Zorg ervoor dat $cloneCount eenmaal tot integer wordt gedwongen , voor de lus. Dat is een heel kleine verbetering, maar het is een goede gewoonte.

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

U moet ook autocommit vermijden. Verminder de transactieoverhead van MySQL per uitvoering van een instructie door een expliciete transactie te starten , enkele duizenden rijen invoegen en vervolgens de transactie uitvoeren.

Maar de beste manier om bulk INSERT van duizenden vergelijkbare rijen in een enkele tabel te versnellen, is door LOAD DATA LOKAAL INFILE in plaats van INVOEREN. Dit werkt 10-20x sneller dan INSERT rij voor rij, zelfs als je parameters, transacties, invoegen met meerdere rijen en elke andere truc gebruikt die je maar kunt bedenken.

Zelfs als je PHP moet gebruiken om je gegevens naar een .CSV-bestand naar schijf te schrijven en vervolgens LOAD DATA LOCAL INFILE op dat bestand te gebruiken, is het nog steeds veel sneller.

Zie ook Snelheid van INSERT-statements in de MySQL-handleiding voor meer tips.



  1. Het resetten van AUTO_INCREMENT duurt lang in MySQL

  2. SQL SELECT eerste N resultaten overslaan?

  3. Laravel 4 gebruikt UUID als primaire sleutel

  4. Inzicht in meerdere kolomindexen in MySQL-query