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

PHP PDO indsæt flere (10000+) samme rækker ved hjælp af bindParam. God øvelse?

Du behøver ikke bindParam() under hver iteration af løkken. bindParam() får variablerne $v1, $v2 osv. til at være bundet ved reference , så alt hvad du skal gøre er at ændre værdierne for disse variabler og derefter genudføre forespørgslen. Det kunne skære ned på overhead.

Du kan også undgå at kalde intval() hver gang gennem løkken. Bare sørg for, at $cloneCount er tvunget til heltal én gang , før løkken. Det er en meget lille forbedring, men det er god praksis.

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

Du bør også undgå autocommit. Reducer transaktionsoverhead for MySQL pr. erklæringsudførelse ved at starte en eksplicit transaktion , indsætte flere tusinde rækker og derefter udføre transaktionen.

Men den bedste måde at fremskynde bulk INSERT af tusindvis af lignende rækker til en enkelt tabel er at bruge INDLÆS DATA LOKAL INFIL i stedet for INSERT. Dette kører 10-20x hurtigere end INSERT række for række, selvom du bruger parametre, transaktioner, multi-row insert og ethvert andet trick, du kan komme i tanke om.

Selvom du skal bruge PHP til at skrive dine data ind i en .CSV-fil til disk og derefter bruge LOAD DATA LOCAL INFILE på den fil, er det stadig meget hurtigere.

Se også Speed ​​of INSERT-erklæringer i MySQL-manualen for flere tips.



  1. Adgang nægtet for brugeren 'brugernavn'@'localhost' (ved hjælp af adgangskode:JA) i C:\webdev\wamp\www\membershipSite\classes\Mysql.php på linje 9

  2. parsing af brugerskrevne fuldtekstsøgningsforespørgsler ind i WHERE-klausulen i MySQL ved hjælp af PHP

  3. PostgreSQL 11 - Procedurer

  4. MySQL-fejl ved forsøg på at afkorte tabel