klausschreiber
Well-known member
- 6 Mai 2006
- 247
- 8
Hallo,
in dem Projekt, an dem ich gerade arbeite, werden von Usern hochgeladene Dateien eingelesen und die Infos sollen dann in einer Datenbank gespeichert werden. Es ist durchaus möglich, dass durch einen Upload mal eben 200 Datenbankeinträge notwendig sind.
Bisher hatte ich dazu eine Tabelle und habe Prepared Statements benutzt (benutze die mysqli Erweiterung in php).
Da sich aber die Daten in bestimmten Feldern wiederholen können und ich die "zusammengehörigen" Zeilen auch in der HTML-Ausgabe gruppiert werden sollen, habe ich nun für diese Datenfelder eine extra Tabelle angelegt.
Dies läuft nun folgendermaßen ab:
Es gibt in der 2. Tabelle 3 Spalten (zuzüglich Primärschlüssel). Über diese 3 Spalten habe ich ein Unique gelegt. Der Insert für diese Tabelle sieht bisher so aus:
"INSERT INTO ...
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
Gibt es den Eintrag noch nicht, wird er eingefügt, ansonsten wird der Primärschlüssel des vorhandenen Eintrags an "last_insert_id" weitergeleitet.
Nun wird in der anderen Tabelle der dazugehörige Eintrag erstellt mit der id von last_insert_id als Fremdschlüssel.
D.h. Wenn z.B. 200 Einträge zu machen sind, bedeutet das 400 Datenbankabfragen. Gibt es einen Weg, das möglichst performant zu machen? Bringt es etwas, wenn ich die Einträge per prepared Statement mache, oder ist das eher schlecht, 2 prepared Statements gleichzeitig "offen" zu haben?
Oder sind 400 Insert's gar kein so großes Problem (die Datenmenge ist relativ klein und es werden wohl auch nicht im Minutentakt soviele Datensätze eingefügt)? Es macht auch nichts, wenn der User 2-3 Sekunden warten muss, allerdings soll das Projekt erstmal auf einem shared Hosting Server laufen und wenn ich den ganzen Server lahmlege, sieht das der Hoster wohl nicht so gerne
.
Gruß,
Klaus
in dem Projekt, an dem ich gerade arbeite, werden von Usern hochgeladene Dateien eingelesen und die Infos sollen dann in einer Datenbank gespeichert werden. Es ist durchaus möglich, dass durch einen Upload mal eben 200 Datenbankeinträge notwendig sind.
Bisher hatte ich dazu eine Tabelle und habe Prepared Statements benutzt (benutze die mysqli Erweiterung in php).
Da sich aber die Daten in bestimmten Feldern wiederholen können und ich die "zusammengehörigen" Zeilen auch in der HTML-Ausgabe gruppiert werden sollen, habe ich nun für diese Datenfelder eine extra Tabelle angelegt.
Dies läuft nun folgendermaßen ab:
Es gibt in der 2. Tabelle 3 Spalten (zuzüglich Primärschlüssel). Über diese 3 Spalten habe ich ein Unique gelegt. Der Insert für diese Tabelle sieht bisher so aus:
"INSERT INTO ...
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
Gibt es den Eintrag noch nicht, wird er eingefügt, ansonsten wird der Primärschlüssel des vorhandenen Eintrags an "last_insert_id" weitergeleitet.
Nun wird in der anderen Tabelle der dazugehörige Eintrag erstellt mit der id von last_insert_id als Fremdschlüssel.
D.h. Wenn z.B. 200 Einträge zu machen sind, bedeutet das 400 Datenbankabfragen. Gibt es einen Weg, das möglichst performant zu machen? Bringt es etwas, wenn ich die Einträge per prepared Statement mache, oder ist das eher schlecht, 2 prepared Statements gleichzeitig "offen" zu haben?
Oder sind 400 Insert's gar kein so großes Problem (die Datenmenge ist relativ klein und es werden wohl auch nicht im Minutentakt soviele Datensätze eingefügt)? Es macht auch nichts, wenn der User 2-3 Sekunden warten muss, allerdings soll das Projekt erstmal auf einem shared Hosting Server laufen und wenn ich den ganzen Server lahmlege, sieht das der Hoster wohl nicht so gerne
Gruß,
Klaus