Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP PDO fügt mehrere (10000+) gleiche Zeilen mit bindParam ein. Gute Übung?

Sie müssen nicht bei jeder Iteration der Schleife bindParam() verwenden. Die bindParam() bewirkt, dass die Variablen $v1, $v2 usw. per Referenz gebunden werden , Sie müssen also nur die Werte dieser Variablen ändern und die Abfrage dann erneut ausführen. Das könnte den Overhead reduzieren.

Sie können auch vermeiden, dass intval() jedes Mal durch die Schleife aufgerufen wird. Stellen Sie nur sicher, dass $cloneCount einmal auf eine Ganzzahl gezwungen wird , vor der Schleife. Das ist eine sehr geringfügige Verbesserung, aber es ist eine bewährte Vorgehensweise.

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

Sie sollten auch Autocommit vermeiden. Reduzieren Sie den Transaktionsaufwand von MySQL pro Anweisungsausführung, indem Sie eine explizite Transaktion starten , mehrere tausend Zeilen einfügen und dann die Transaktion festschreiben.

Aber der beste Weg, das Massen-INSERT von Tausenden ähnlicher Zeilen in eine einzelne Tabelle zu beschleunigen, ist die Verwendung von LOKALES DATEN-INFILE LADEN statt EINFÜGEN. Dies läuft 10-20x schneller als INSERT Zeile für Zeile, selbst wenn Sie Parameter, Transaktionen, mehrzeilige Einfügungen und jeden anderen Trick verwenden, der Ihnen einfällt.

Selbst wenn Sie PHP verwenden müssen, um Ihre Daten in eine .CSV-Datei auf die Festplatte zu schreiben, und dann LOAD DATA LOCAL INFILE für diese Datei verwenden müssen, ist es immer noch viel schneller.

Siehe auch Geschwindigkeit von INSERT-Anweisungen im MySQL-Handbuch für weitere Tipps.