sql >> Databáze >  >> RDS >> Mysql

Jak špatné je použití SELECT MAX(id) v MYSQL místo mysql_insert_id() v PHP?

Nejde o to, zda jsou pravděpodobné potenciální špatné situace. Jde o to, jestli jsou možné. Pokud existuje netriviální pravděpodobnost výskytu problému, je třeba se mu vyhnout, pokud je známa.

Není to tak, že bychom mluvili o změně volání funkce jednoho řádku na monstrum s 5000 řádky, abychom se vypořádali se vzdáleně možným případem okraje. Mluvíme o skutečném zkrácení volání na čitelnější a správnější použití.

Souhlasím s @Markem Bakerem, že je třeba zvážit výkon, ale protože id je primární klíč, MAX dotaz bude velmi rychlý. Jistě, LAST_INSERT_ID() bude rychlejší (protože jde jen o čtení z proměnné relace), ale jen o triviální množství.

A k tomu nepotřebujete mnoho uživatelů. Vše, co potřebujete, je hodně souběžných požadavků (ani ne tolik). Pokud je čas mezi zahájením vložení a začátek výběru je 50 milisekund (za předpokladu, že databázový engine bezpečný pro transakce), pak potřebujete pouze 20 požadavků za sekundu, abyste s tímto začali konzistentně narážet na problém. Jde o to, že okno pro chyby je netriviální. Pokud řeknete 20 požadavků za sekundu (což ve skutečnosti není mnoho) a za předpokladu, že průměrný člověk navštíví jednu stránku za minutu, mluvíte pouze o 1200 uživatelích. A to proto, aby se to dělo pravidelně. Může se to stát jednou pouze se 2 uživateli.

A přímo z dokumentace MySQL na předmět :

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. Postgresql Vyberte řádky, kde sloupec =pole

  2. Kód chyby:1136 Počet sloupců neodpovídá počtu hodnot na řádku 1) uvnitř sp

  3. Manipulace s připojením a omezení s ProxySQL

  4. SQL dotaz s binárními daty (PHP a MySQL)