Ich übergebe ein großes Dataset mithilfe von Einfügebefehlen über PHP in eine MySQL-Tabelle und frage mich, ob es möglich ist, ungefähr 1000 Zeilen gleichzeitig über eine andere Abfrage einzufügen, als jeden Wert am Ende einer kilometerlangen Zeichenfolge anzuhängen und dann es ausführen. Ich verwende das CodeIgniter-Framework, damit mir auch seine Funktionen zur Verfügung stehen.
php
mysql
codeigniter
insert
bulkinsert
toofarsideways
quelle
quelle
Antworten:
Das Zusammenstellen einer
INSERT
Anweisung mit mehreren Zeilen ist in MySQL viel schneller als eineINSERT
Anweisung pro Zeile.Das heißt, es hört sich so an, als ob Sie in PHP auf Probleme beim Umgang mit Zeichenfolgen stoßen, was wirklich ein Algorithmusproblem ist, kein Sprachproblem. Grundsätzlich möchten Sie beim Arbeiten mit großen Zeichenfolgen unnötiges Kopieren minimieren. In erster Linie bedeutet dies, dass Sie eine Verkettung vermeiden möchten. Der schnellste und speichereffizienteste Weg, um eine große Zeichenfolge zu erstellen, z. B. um Hunderte von Zeilen gleichzeitig einzufügen, besteht darin, die
implode()
Funktions- und Arrayzuweisung zu nutzen.Der Vorteil dieses Ansatzes besteht darin, dass Sie die SQL-Anweisung, die Sie bisher zusammengestellt haben, nicht bei jeder Verkettung kopieren und erneut kopieren. Stattdessen macht PHP dies einmal in der
implode()
Anweisung. Dies ist ein großer Gewinn.Wenn Sie viele Spalten zusammenstellen müssen und eine oder mehrere sehr lang sind, können Sie auch eine innere Schleife erstellen, um dasselbe zu tun und
implode()
die Werteklausel dem äußeren Array zuzuweisen.quelle
mysql_real_escape_string
mitmysqli_real_escape_string
undmysql_query
mitmysqli_query
MySQLi zu wechseln, und diese sind ab PHP5 veraltet. Danke vielmals!mysql_*
wurde aus PHP entfernt, verwenden Sie also unbedingt diemysqli_*
Schnittstelle.Mehrfacheinfügung / Stapeleinfügung wird jetzt vom Codeigniter unterstützt. Ich hatte das gleiche Problem. Obwohl es sehr spät ist, Fragen zu beantworten, wird es jemandem helfen. Deshalb beantworte ich diese Frage.
quelle
Sie können die Abfrage zum Einfügen einer Zeile mit der Klasse mysqli_stmt vorbereiten und dann über das Datenarray iterieren. Etwas wie:
Wobei 'idsb' die Arten der Daten sind, die Sie binden (int, double, string, blob).
quelle
Ich weiß, dass dies eine alte Abfrage ist, aber ich habe gerade gelesen und dachte, ich würde hinzufügen, was ich woanders gefunden habe:
mysqli in PHP 5 ist ein Ojbect mit einigen guten Funktionen, mit denen Sie die Einfügezeit für die obige Antwort beschleunigen können:
Das Deaktivieren der automatischen Festschreibung beim Einfügen vieler Zeilen beschleunigt das Einfügen erheblich. Deaktivieren Sie sie daher und führen Sie sie wie oben beschrieben aus. Erstellen Sie einfach eine Zeichenfolge (sqlCombined), bei der es sich um viele Einfügeanweisungen handelt, die durch Semikolons und Mehrfachabfragen getrennt sind.
Hoffe das hilft jemandem Zeit zu sparen (suchen und einfügen!)
R.
quelle
Sie können immer MySQL verwenden
LOAD DATA
:Masseneinfügungen durchführen, anstatt eine Reihe von
INSERT
Anweisungen zu verwenden.quelle
LOCAL
Bit.Nun, Sie möchten nicht 1000 Abfrageaufrufe ausführen, aber dies ist in Ordnung:
Abhängig von Ihrer Datenquelle ist das Auffüllen des Arrays möglicherweise so einfach wie das Öffnen einer Datei und das Ablegen des Inhalts in ein Array über
file()
.quelle
quelle
Sie können dies im Codeigniter auf verschiedene Arten tun, z
quelle
Obwohl es zu spät ist, diese Frage zu beantworten. Hier ist meine Antwort auf die gleiche.
Wenn Sie CodeIgniter verwenden, können Sie integrierte Methoden verwenden, die in der Klasse query_builder definiert sind.
$ this-> db-> insert_batch ()
Generiert eine Einfügezeichenfolge basierend auf den von Ihnen angegebenen Daten und führt die Abfrage aus. Sie können entweder ein Array oder ein Objekt an die Funktion übergeben. Hier ist ein Beispiel mit einem Array:
);
Der erste Parameter enthält den Tabellennamen, der zweite ist ein assoziatives Array von Werten.
Weitere Details zu query_builder finden Sie hier
quelle
Ich habe eine Klasse erstellt, die mehrere Zeilen ausführt und wie folgt verwendet wird:
wobei die Klasse wie folgt definiert ist:
quelle
Verwenden Sie Batch in Codeigniter einfügen, um mehrere Datenzeilen einzufügen.
quelle
Ich habe diese einfache Funktion erstellt, die ihr leicht benutzen könnt. Sie müssen den Tabellennamen
($tbl)
und das Tabellenfeld($insertFieldsArr)
an Ihr Datenfeld für das Einfügen von Daten übergeben($arr)
.quelle