Im Rahmen eines PHP-Projekts muss ich eine Zeile in eine MySQL-Datenbank einfügen. Ich bin das natürlich gewohnt, aber dafür musste in einer Abfrage in 90 Spalten eingefügt werden. Die resultierende Abfrage sieht schrecklich und monolithisch aus (insbesondere das Einfügen meiner PHP-Variablen als Werte):
INSERT INTO mytable (column1, colum2, ..., column90)
VALUES
('value1', 'value2', ..., 'value90')
und ich mache mir Sorgen, dass ich das nicht richtig mache. Ich habe auch eine lange (langweilige) Zeit gebraucht, um alles einzutippen, und das Testen des Testcodes wird meiner Meinung nach ebenso mühsam sein.
Wie schreiben und testen Profis diese Abfragen schnell? Gibt es eine Möglichkeit, den Prozess zu beschleunigen?
php
mysql
efficiency
Joe
quelle
quelle
Antworten:
Joe, dein letzter Kommentar hat viel erklärt. Ich denke, das eigentliche Problem ist das Daten-Design. Neue Spalten können erforderlich sein, wenn sich das Dokumentformat ändert, und meiner Erfahrung nach ändern sich Dokumentformate häufig. Anstelle einer Tabelle mit 90 Spalten und einer einzelnen Zeile pro Bericht würde ich die Berichtsdaten in einer Tabelle mit vier Spalten speichern: Berichts-ID, Format-ID, Feldname, Feldwert. Jeder Bericht würde durch 90 Zeilen dargestellt, eine für jeden Feldwert im Bericht. Dies sollte Ihren Code erheblich vereinfachen.
quelle
Im Allgemeinen können Sie ein großes Dataset am schnellsten in eine SQL-Datenbank laden, indem Sie die native Bulk-Ladeschnittstelle verwenden. Soweit ich weiß, hat jede SQL-Datenbank mindestens eine.
MySQL-Dokumente: Verwenden des Bulk Loader
Wenn ich habe eine Tab- oder kommagetrennte Datei in SQL INSERT - Anweisungen zu machen, verwende ich awk die Eingabedatei zu lesen und die Ausgabedatei schreiben. Awk hat nichts Besonderes; Es ist einfach die Textverarbeitungssprache, die ich am besten kenne. Sie können dieselben Ergebnisse erzielen, indem Sie Code in Perl, Python, Ruby, Rexx, Lisp usw. schreiben.
quelle
Wenn Sie die Spaltennamen problemlos in eine Excel-Tabelle einfügen können, können Sie Excel-Makros schreiben, um Code für verschiedene Abfragen und DML-Anweisungen zu erstellen. Fügen Sie dann einfach Werte in eine andere Spalte ein, und Ihre Anweisung zum Einfügen / Aktualisieren wird automatisch für Sie erstellt. Das manuelle Tippen ist eine sehr langsame Methode. Sehen Sie also nach, ob Sie mit Ihren vorhandenen Tools Tricks finden können. Viele entwicklerorientierte Texteditoren können auch Makros aufzeichnen und speichern, um sich wiederholende Jobs wie diesen viel schneller und einfacher zu machen.
quelle
Wenn Sie eine CSV-Datei haben, können Sie die Daten mit LOAD DATA INFILE ... importieren.
Wenn Sie 'INSERT'-Abfragen verwenden müssen, wird der Vorgang durch Masseneinfügungen beschleunigt. Anstatt eine 'INSERT'-Abfrage für jede einzelne Zeile auszuführen, gruppieren Sie die Zeilen, z. B. 100, und führen Sie die Abfrage aus. Etwas wie das:
quelle
Eine effiziente Möglichkeit, mehrspaltige Abfragedaten in MySQL DB zu schreiben, besteht darin, diese Daten in das JSON- oder YAML-Format zu konvertieren und als einzelne Einheit einzufügen. Es ändert "Schreiben Sie eine Einfügung für eine Tabelle mit 90 Spalten" in "Schreiben Sie eine Einfügung in eine Tabelle mit einer Spalte".
Bei diesem Ansatz muss nicht alles in seine Basiskomponenten zerlegt werden, und das einzelne Datum wird nur in einer Spalte gespeichert.
quelle
Mit MySQL können Sie alternative Syntax für
insert
Anweisungen verwenden:quelle
Ihr Szenario passt sehr gut zu einer NoSQL-Lösung, da sich die Attributliste jederzeit ändern kann, wenn sich das Format ändert. Haben Sie andere Optionen als MySQL evaluiert? Stöbern Sie in DynamoDB / MongoDB / Cassandra - das passt vielleicht besser.
quelle
Es gibt eine effizientere Möglichkeit, Daten mithilfe von PHP und MySQL in die Datenbank einzufügen. Wir können LOAD COMMAND verwenden, um die Daten einzufügen. Es fügt Daten bemerkenswert schnell ein.
Erstellen Sie dazu eine flache Datei (zum Beispiel habe ich eine CSV-Datei verwendet) mit Ihren Daten mithilfe der
fputcsv()
Funktion. Fügen Sie dann Daten mit dem Befehl LOAD ein. Syntax einige ähnlich wie unten:quelle
Versuche Folgendes. Hat für mich gearbeitet.
Formularnamen müssen den Namen der Datenbankspalten entsprechen
Erhalten Sie die folgenden Werte:
Sie müssen zuerst eine ID vor der foreach-Schleife einfügen. Sie können die nächste ID erhalten, indem Sie Folgendes tun:
addiere 1 zu id und füge es ein.
quelle