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.