Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak złe jest używanie SELECT MAX(id) w MYSQL zamiast mysql_insert_id() w PHP?

Nie chodzi o to, czy prawdopodobne są potencjalne złe sytuacje. Chodzi o to, czy są możliwe. Tak długo, jak istnieje nietrywialne prawdopodobieństwo wystąpienia problemu, jeśli wiadomo, należy tego unikać.

To nie jest tak, że mówimy o zmianie jednoliniowego wywołania funkcji na 5000-liniowego potwora, aby poradzić sobie ze zdalnie możliwym przypadkiem brzegowym. Mówimy o skróceniu połączenia do bardziej czytelnego i bardziej poprawnego użycia.

W pewnym sensie zgadzam się z @Mark Bakerem, że jest trochę uwagi na wydajność, ale ponieważ id jest kluczem podstawowym, MAX zapytanie będzie bardzo szybkie. Jasne, LAST_INSERT_ID() będzie szybszy (ponieważ tylko odczytuje ze zmiennej sesji), ale tylko o niewielką ilość.

I do tego nie potrzeba wielu użytkowników. Wszystko czego potrzebujesz to dużo jednoczesnych żądań (nawet nie tak dużo). Jeśli czas między rozpoczęciem wstawiania, a początek zaznaczania to 50 milisekund (zakładając, że silnik bazy danych bezpieczny dla transakcji), wtedy potrzebujesz tylko 20 żądań na sekundę, aby zacząć konsekwentnie trafiać na problem. Chodzi o to, że okno na błąd nie jest trywialne. Jeśli powiesz 20 żądań na sekundę (co w rzeczywistości nie jest dużo) i zakładając, że przeciętna osoba odwiedza jedną stronę na minutę, mówisz tylko o 1200 użytkownikach. A to po to, żeby działo się to regularnie. Może się to zdarzyć raz przy tylko 2 użytkownikach.

I bezpośrednio z dokumentacji MySQL na temat :

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Domyślna wartość MySQL jako wartość innego pola

  2. Instalacja Percona/MySQL bez nadzoru na Ubuntu

  3. znajdź N-ty największy element w SQL

  4. Cx-Freeze :Showwarning AttributeError:Obiekt „NoneType” nie ma atrybutu „write”

  5. Dostęp do roota MySQL ze wszystkich hostów