Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelle est la gravité de l'utilisation de SELECT MAX(id) dans MYSQL au lieu de mysql_insert_id() dans PHP ?

Le point n'est pas si de mauvaises situations potentielles sont probables. Le point est s'ils sont possibles. Tant qu'il existe une probabilité non négligeable que le problème se produise, s'il est connu, il doit être évité.

Ce n'est pas comme si nous parlions de transformer un appel de fonction d'une ligne en un monstre de 5000 lignes pour traiter un cas limite possible à distance. Nous parlons en fait de raccourcir l'appel à un usage plus lisible et plus correct.

Je suis un peu d'accord avec @Mark Baker sur le fait qu'il y a une certaine considération de performance, mais depuis id est une clé primaire, le MAX la requête sera très rapide. Bien sûr, le LAST_INSERT_ID() sera plus rapide (puisqu'il ne s'agit que de lire à partir d'une variable de session), mais seulement d'une quantité insignifiante.

Et vous n'avez pas besoin de beaucoup d'utilisateurs pour que cela se produise. Tout ce dont vous avez besoin, c'est d'un grand nombre de requêtes simultanées (même pas tant que ça). Si le temps entre le début de l'insertion et le début de la sélection est de 50 millisecondes (en supposant un moteur de base de données sécurisé pour les transactions), alors vous n'avez besoin que de 20 requêtes par seconde pour commencer à rencontrer un problème avec cela de manière cohérente. Le fait est que la fenêtre d'erreur n'est pas triviale. Si vous dites 20 requêtes par seconde (ce qui en réalité n'est pas beaucoup), et en supposant que la personne moyenne visite une page par minute, vous ne parlez que de 1200 utilisateurs. Et c'est pour que cela se produise régulièrement. Cela peut arriver une fois avec seulement 2 utilisateurs.

Et dès la documentation MySQL sur le sujet :

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.