Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL InnoDB SELECT ... LIMIT 1 FOR UPDATE Vs UPDATE ... LIMIT 1

Da ich keine Antwort bekam, fing ich an Benchmarking zu machen. Meine Kriterien sind wie folgt:

  • 20.000 vorgenerierte Codes
  • Verwendung von Apache ab Befehl mit 20.000 Anfragen, 100 Parallelität:ab -n 20000 -c 100
  • Servlet -> EJB (JPA 2.0 EclipseLink, JTA), um die Aktualisierung in der DB durchzuführen (wie es in der realen Situation durch eine JSF-Aktion geschehen wird)
  • 2 Versionen des Servlets, eine mit Option 1 (SELECT ... FOR UPDATE ) und eine mit Option 2 (UPDATE ... LIMIT 1)
  • Glassfish gestoppt, das getestete Servlet 5 Mal manuell angefahren, um es aufzuwärmen, alles auf NULL auf user_id zurückgesetzt
  • Die Tests werden jeweils dreimal durchgeführt und der Durchschnitt wird angegeben

Ergebnisse:

... FÜR AKTUALISIERUNG AUSWÄHLEN; AKTUALISIEREN ... :

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

AKTUALISIEREN.... GRENZE 1:

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

Zumindest auf meinem System scheint also die Option mit 2 Abfragen effizienter zu sein als die eine Abfrage. Damit hatte ich nicht gerechnet :)