Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL InnoDB SELECT...LIMITE 1 PER AGGIORNAMENTO Vs UPDATE...LIMITE 1

Dal momento che non ho ricevuto risposta, ho iniziato a fare benchmarking. I miei criteri sono i seguenti:

  • 20.000 codici pregenerati
  • Utilizzo di Apache ab comando con 20.000 richieste, 100 simultaneità:ab -n 20000 -c 100
  • Servlet -> EJB (JPA 2.0 EclipseLink, JTA) per eseguire l'aggiornamento in DB (come avverrà tramite un'azione JSF nella situazione reale)
  • 2 versioni del servlet, una con l'opzione 1 (SELECT ... FOR UPDATE) e una con l'opzione 2 (UPDATE ... LIMIT 1)
  • Arrestato Glassfish, colpisci manualmente il servlet testato 5 volte per riscaldarlo, ripristina tutto su NULL su user_id
  • I test vengono eseguiti 3 volte ciascuno e viene fornita la media

Risultati:

SELEZIONA... PER AGGIORNARE; AGGIORNAMENTO... :

Concurrency Level:      100
Time taken for tests:   758.116 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Row updated:            20000

AGGIORNAMENTO.... LIMITE 1:

Concurrency Level:      100
Time taken for tests:   773.659 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Row updated:            20000

Quindi, almeno sul mio sistema, l'opzione con 2 query sembra più efficiente dell'unica query. Non me lo aspettavo :)