Het gaat er niet om of potentieel slechte situaties waarschijnlijk zijn. Het gaat erom of ze mogelijk zijn. Zolang er een niet-triviale kans is dat het probleem zich voordoet, moet het worden vermeden als het bekend is.
Het is niet alsof we het hebben over het veranderen van een functieaanroep van één regel in een monster van 5000 regels om een op afstand mogelijk randgeval aan te pakken. We hebben het over het verkorten van de oproep tot een beter leesbaar en correcter gebruik.
Ik ben het min of meer eens met @Mark Baker dat er enige prestatie-overweging is, maar sinds id
is een primaire sleutel, de MAX
vraag zal zeer snel zijn. Natuurlijk, de LAST_INSERT_ID()
zal sneller zijn (omdat het alleen uit een sessievariabele leest), maar slechts in een triviale hoeveelheid.
En je hebt niet veel gebruikers nodig om dit te laten gebeuren. Het enige dat u nodig hebt, zijn veel gelijktijdige verzoeken (zelfs niet zoveel). Als de tijd tussen de start van de insert en de start van de select is 50 milliseconden (uitgaande van een transactieveilige DB-engine), dan heb je slechts 20 verzoeken per seconde nodig om hiermee consistent een probleem aan te pakken. Het punt is dat het venster voor fouten niet triviaal is. Als je zegt 20 verzoeken per seconde (wat in werkelijkheid niet veel is), en ervan uitgaande dat de gemiddelde persoon één pagina per minuut bezoekt, heb je het over 1200 gebruikers. En dat is om het regelmatig te laten gebeuren. Het kan een keer gebeuren met slechts 2 gebruikers.
En direct uit de MySQL-documentatie op het onderwerp :
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.