sql >> Databasteknik >  >> RDS >> Mysql

PHP PDO infoga flera (10000+) samma rader med bindParam. Bra övning?

Du behöver inte bindParam() under varje iteration av loopen. BindParam() gör att variablerna $v1, $v2, etc. binds genom referens , så allt du behöver göra är att ändra värdena för dessa variabler och sedan köra frågan igen. Det kan skära ner på overheaden.

Du kan också undvika att anropa intval() varje gång genom loopen. Se bara till att $cloneCount tvingas till heltal en gång , före loopen. Det är en mycket liten förbättring, men det är god praxis.

$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 också undvika autocommit. Minska transaktionsoverheaden för MySQL per uttalandeexekvering genom att starta en explicit transaktion , infoga flera tusen rader och sedan utföra transaktionen.

Men det bästa sättet att påskynda mass-INSERT av tusentals liknande rader till en enda tabell är att använda LADDA LOKAL INFIL FÖR DATA istället för INSERT. Detta går 10-20 gånger snabbare än INSERT rad för rad, även om du använder parametrar, transaktioner, infogning av flera rader och alla andra knep du kan tänka dig.

Även om du måste använda PHP för att skriva in dina data till en .CSV-fil till disken och sedan använda LOAD DATA LOCAL INFILE på den filen, går det fortfarande mycket snabbare.

Se även Speed ​​of INSERT Statements i MySQL-manualen för fler tips.



  1. Förstå "datetime2" lagringsstorlek i SQL Server

  2. Hämtar tidsstämpelvärde från mysql-databasen med Spring JDBC-mall

  3. mysql castar automatiskt strängar till heltal

  4. SQL:Välj den sista posten för varje dag given datetime