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

Wie schlecht ist die Verwendung von SELECT MAX(id) in MYSQL anstelle von mysql_insert_id() in PHP?

Der Punkt ist nicht, ob mögliche schlechte Situationen wahrscheinlich sind. Der Punkt ist, ob sie möglich sind. Solange eine nicht unerhebliche Wahrscheinlichkeit besteht, dass das Problem auftritt, sollte es vermieden werden, wenn es bekannt ist.

Es ist nicht so, dass wir davon sprechen, einen einzeiligen Funktionsaufruf in ein 5000-Zeilen-Monster umzuwandeln, um mit einem entfernt möglichen Grenzfall fertig zu werden. Wir sprechen davon, den Aufruf auf eine besser lesbare und korrektere Verwendung zu verkürzen.

Ich stimme @Mark Baker zu, dass es einige Überlegungen zur Leistung gibt, aber seit id ist ein Primärschlüssel, der MAX Abfrage wird sehr schnell sein. Sicher, die LAST_INSERT_ID() wird schneller sein (da es nur von einer Session-Variablen liest), aber nur um einen trivialen Betrag.

Und Sie brauchen nicht viele Benutzer, damit dies geschieht. Alles, was Sie brauchen, sind viele gleichzeitige Anfragen (nicht einmal so viele). Wenn die Zeit zwischen dem Start des Einfügens und des Starts des Auswählens 50 Millisekunden beträgt (unter der Annahme einer transaktionssicheren DB-Engine), dann benötigen Sie nur 20 Anfragen pro Sekunde, um damit konsistent auf ein Problem zu stoßen. Der Punkt ist, dass das Fehlerfenster nicht trivial ist. Wenn Sie 20 Anfragen pro Sekunde sagen (was in Wirklichkeit nicht viel ist) und davon ausgehen, dass die durchschnittliche Person eine Seite pro Minute besucht, sprechen Sie nur von 1200 Benutzern. Und das, damit es regelmäßig passiert. Es könnte einmal mit nur 2 Benutzern passieren.

Und zwar direkt ab der MySQL-Dokumentation das Thema :

You can generate sequences without calling LAST_INSERT_ID(), but the utility of 
using the function this way is that the ID value is maintained in the server as 
the last automatically generated value. It is multi-user safe because multiple 
clients can issue the UPDATE statement and get their own sequence value with the
SELECT statement (or mysql_insert_id()), without affecting or being affected by 
other clients that generate their own sequence values.