sql >> Base de Datos >  >> RDS >> Mysql

Actualizar usando `database/sql` en Go es lento

(Hablando desde el punto de vista de MySQL...)

Algunas "reglas generales":

  • Único INSERT :10ms
  • 100 o más filas insertadas por un solo INSERT :10 veces más rápido por fila.
  • BEGIN; INSERT...; INSERT...; ... COMMIT; :También 10x.
  • Lo anterior supone HDD; SSD podría ser 10 veces más rápido.
  • Si varias conexiones están haciendo cada una inserciones, pueden ser capaz de funcionar en paralelo. 10 subprocesos podrían hacer 5 veces el trabajo en el mismo tiempo transcurrido. (Por supuesto, esto puede agregar complejidad no deseada a la aplicación).

Cifras similares para UPDATE , aunque no es fácil hacer diferentes actualizaciones en diferentes filas con una sola consulta.

Su prueba muestra 8,5 ms por fila UPDATEd al hacer una fila a la vez. Lotes con BEGIN...COMMIT probablemente tomará alrededor de 85 ms para las 100 filas, incluso en HDD.

Algunas aplicaciones se prestan al procesamiento por lotes; algunos no. Si desea hablar sobre cómo mejorar el rendimiento de MySQL, debemos entrar en los detalles de su aplicación.

Los contadores "Me gusta" y "Ver" pueden deben moverse a una tabla 'paralela' ya que tienden a actualizarse uno a la vez, con alguna interferencia con otra actividad. También tienden a permitir automáticamente subprocesos múltiples, por lo tanto, mucho menos de 850 ms por 100. En una actividad realmente alta (más de, digamos, 1K vistas por segundo), estos contadores se pueden agrupar artificialmente a través de un código de aplicación adicional.

Vuelva a escribir su punto de referencia para reflejar la actividad que ocurrirá en la aplicación real. (Estoy suponiendo que las Actualizaciones ocurrirán en paralelo, no en serie. Y se distribuirán aleatoriamente a lo largo del tiempo).

Otra cosa... Si cada "recuento de vistas" llega a un servidor web, también hay conexión y desconexión; de ahí el transcurrido es probable que el tiempo sea más de 8,5 ms. Pero "transcurrido" no es el tema crítico; el verdadero problema es "cuántas actualizaciones se pueden realizar por segundo".)

Y otra cosa... Si prueba 'paralelo', no presione la misma fila en cada solicitud. Eso probablemente será mucho más lento que si golpea diferentes filas. (Acertar en una fila aleatoria sería mejor. Tener un sesgo en qué fila acertar sería incluso más realista).