Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

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


Como não obtive resposta, comecei a fazer benchmarking. Meus critérios são os seguintes:
  • 20.000 códigos pré-gerados
  • Uso do Apache ab comando com 20.000 solicitações, 100 simultaneidade:ab -n 20000 -c 100
  • Servlet -> EJB (JPA 2.0 EclipseLink, JTA) para realizar a atualização no DB (pois será através de uma ação JSF em situação real)
  • 2 versões do Servlet, uma com opção 1 (SELECT ... FOR UPDATE ), e outra com opção 2 (UPDATE ... LIMIT 1)
  • Pare o Glassfish, pressione o Servlet testado manualmente 5 vezes para aquecê-lo, redefina tudo para NULL para user_id
  • Os testes são executados 3 vezes cada e a média é fornecida

Resultados:

SELECIONE... PARA ATUALIZAÇÃO; ATUALIZAR ... :
Concurrency Level:      100
Time taken for tests:   758.116 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Row updated:            20000

ATUALIZAÇÃO.... LIMITE 1:
Concurrency Level:      100
Time taken for tests:   773.659 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Row updated:            20000

Então, pelo menos no meu sistema, a opção com 2 consultas parece mais eficiente do que uma consulta. Eu não esperava isso :)