effizienteste Art, zu ermitteln ob Wert in DB existiert
Was ist die effizienteste Art, zu testen, ob ein Wert in einer DB schon gesetzt wurde, um darauf Fallbezogen ein INSERT oder UPDATE nachzusenden?
Würde jetzt ein einfaches SELECT ansetzen, oder gibt es bessere Funktionen, die mit geringerem Overhead auskommen?
Ich würde mit :
SELECT xName FROM TableX WHERE xName=$xName
abfragen, ob Ergebnissatz vorhanden. Wenn ja, ein UPDATE nachsenden, wenn nein ein INSERT.
Das wirkt auf mich sehr ineffizient. geht doch bestimmt eleganter??
Würde jetzt ein einfaches SELECT ansetzen, oder gibt es bessere Funktionen, die mit geringerem Overhead auskommen?
Ich würde mit :
SELECT xName FROM TableX WHERE xName=$xName
abfragen, ob Ergebnissatz vorhanden. Wenn ja, ein UPDATE nachsenden, wenn nein ein INSERT.
Das wirkt auf mich sehr ineffizient. geht doch bestimmt eleganter??
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (15. Januar 2008, 14:41)
Wer nicht sucht, der auch nicht findet, der auch nicht weiss... 
Suche und Finden = SELECT x FROM y WHERE z
eine andere Lösung würde ich sagen, gibt es dafür nicht. :-)
Und wenn es keine Hardcore-Tabellen sind oder du den langsamsten Server der Menschheitsgeschichte erwischt hast, dürfte es auch kein großes Problem sein.
Ausnahme:
siehst du ein paar Themen weiter unten... letzte Inkrementalzahl holen.
Aber ich denke du meinst ja irgendein x-beliebiges Feld mit x-beliebigem Inhalt, oder?

Suche und Finden = SELECT x FROM y WHERE z
eine andere Lösung würde ich sagen, gibt es dafür nicht. :-)
Und wenn es keine Hardcore-Tabellen sind oder du den langsamsten Server der Menschheitsgeschichte erwischt hast, dürfte es auch kein großes Problem sein.
Ausnahme:
siehst du ein paar Themen weiter unten... letzte Inkrementalzahl holen.
Aber ich denke du meinst ja irgendein x-beliebiges Feld mit x-beliebigem Inhalt, oder?
Zitat
Original von Skittles
man könnt nen update machen und wenn das schief geht, nen insert hinterher, aber so wirklich gut ist das auch nicht![]()
Also manche MySQL Versionen machen bei einem Update Automatisch ein Insert, funktioniert zumindest bei mir hier in einem script, dass ich für mich geschrieben habe...
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Nu da gibts noch was .... nein, das ist zu elitär .... was solls:
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (16. Januar 2008, 09:12)
zumindest interessant, wenn auch im konkreten Fall nicht ganz zutreffend, da ja auf Existenz eines Wertes bzw. eines Datensatzes geprüft werden soll, der Trigger jedoch (wenn ich es richtig gesehen habe) vor oder nach einer Aktion weitere Aktionen anstoßen kann (mal salopp gesagt).
Trotzdem gute Quelle...
Trotzdem gute Quelle...
Zitat
Original von ospx
zumindest interessant, wenn auch im konkreten Fall nicht ganz zutreffend, da ja auf Existenz eines Wertes bzw. eines Datensatzes geprüft werden soll, der Trigger jedoch (wenn ich es richtig gesehen habe) vor oder nach einer Aktion weitere Aktionen anstoßen kann (mal salopp gesagt).
Trotzdem gute Quelle...
Ein teil eines Beispiels darin ist trotzdem sehr passend für dieses Problem:
|
|
Quellcode |
1 |
INSERT INTO ... ON DUPLICATE KEY UPDATE ... |
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
@ heiner ok, da habe ich beim querlesen was übersehen.
@jetson224 : das ist ja die bekannte Ausgangslage und genau das, was ich gerade umgehen will( ok , du nutz ein count(), das ist u.U. eine kleine optimierung), da hier eigentlich ein gesamtes Statement gesendet, vom DB-Server beantwortet, zurückgesendet und von mir mit php wieder ausgewertet werden muss, worauf ich dann erst mit der eigentlichen Transaktion (UPDATE oder INSERT) beginnen könnte.
Mit jedem Sendevorgang werden zig byte für das wrappen der IP-Packete etc. verballert, obwohl als Antwort fast ein einzelnes Bit, Flag (ja/nein) ausreichen würde, ob Wert vorhanden oder nicht.
Laufen einige 100 dieser Abfragen, wird daraus ein wahnsinniger aufgeblähter Überhang, der aus meiner Sicht fast nicht vertretbar wäre.
Die Sache mit den Triggern ist eigentlich genau, was ich suchte.
@jetson224 : das ist ja die bekannte Ausgangslage und genau das, was ich gerade umgehen will( ok , du nutz ein count(), das ist u.U. eine kleine optimierung), da hier eigentlich ein gesamtes Statement gesendet, vom DB-Server beantwortet, zurückgesendet und von mir mit php wieder ausgewertet werden muss, worauf ich dann erst mit der eigentlichen Transaktion (UPDATE oder INSERT) beginnen könnte.
Mit jedem Sendevorgang werden zig byte für das wrappen der IP-Packete etc. verballert, obwohl als Antwort fast ein einzelnes Bit, Flag (ja/nein) ausreichen würde, ob Wert vorhanden oder nicht.
Laufen einige 100 dieser Abfragen, wird daraus ein wahnsinniger aufgeblähter Überhang, der aus meiner Sicht fast nicht vertretbar wäre.
Die Sache mit den Triggern ist eigentlich genau, was ich suchte.
Das Hauptproblem liegt darin das eine unbekannte anzahl von Zugriffen und Änderungen asynchron in die Datenbank laufen.
Also das zwischen
INSERT / DELETE / UPDATE
und
SELECT MAX (ID)
weitere Datenbankänderungen die Rückgabe des select-Querys verfälschen könnten.
Ein Trigger könnte durch beispielsweise eine "LastID's" Tabelle das Problem umgehen, dort muss dann auch die eindeutigkeit der Aktion gespeichert werden (wir nehmen die SessionID des benutzers).
Wenn jetzt aber jemand durch ein Submit ein Insert Fährt, das Laden der Webseite abbricht und dann nochmal auf Submit klickt und das Insert zum 2. mal fährt werden 2 Einträge hinzugefügt weil es sich um die gleiche SessionID handelt!
Also mit der eigentlichen Aufgabe könnte man das schon lösen, aber nicht ohne "Overhead"!
ON DUPLICATE KEY ist wohl die beste lösung
Also das zwischen
INSERT / DELETE / UPDATE
und
SELECT MAX (ID)
weitere Datenbankänderungen die Rückgabe des select-Querys verfälschen könnten.
Ein Trigger könnte durch beispielsweise eine "LastID's" Tabelle das Problem umgehen, dort muss dann auch die eindeutigkeit der Aktion gespeichert werden (wir nehmen die SessionID des benutzers).
Wenn jetzt aber jemand durch ein Submit ein Insert Fährt, das Laden der Webseite abbricht und dann nochmal auf Submit klickt und das Insert zum 2. mal fährt werden 2 Einträge hinzugefügt weil es sich um die gleiche SessionID handelt!
Also mit der eigentlichen Aufgabe könnte man das schon lösen, aber nicht ohne "Overhead"!
ON DUPLICATE KEY ist wohl die beste lösung
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »nocturne« (18. Januar 2008, 10:17)
Guten Tag, Herr nocturne 
Wohl wahr und obendrein sprichst du da mein nächstes weit größeres Problem an. Aber dafür kommt wohl in den nächsten Tagen ein neuer Thread an dieser Stelle.
Damit meine ich:

Wohl wahr und obendrein sprichst du da mein nächstes weit größeres Problem an. Aber dafür kommt wohl in den nächsten Tagen ein neuer Thread an dieser Stelle.
Damit meine ich:
unbekannte anzahl von Zugriffen und Änderungen asynchron
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (18. Januar 2008, 10:22)


