sql >> Database >  >> RDS >> Mysql

Hoe slecht is het gebruik van SELECT MAX(id) in MYSQL in plaats van mysql_insert_id() in PHP?

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.


  1. Laat MySQL auto-increment id (opnieuw) starten vanaf 1

  2. Hoe u de verkoopgegevens van de laatste 3 maanden in MySQL kunt krijgen

  3. SQL:wat is de standaardvolgorde van query's?

  4. Hoe SQL Server op Windows te installeren