El registro perjudica el rendimiento de MySQL, pero ¿por qué?

9

Estoy bastante sorprendido de que no pueda ver una respuesta a esto en ninguna parte del sitio, ni en la documentación de MySQL (¡la sección 5.2 parece tener un registro de otra manera bien cubierto!)

Si habilito binlogs, veo un pequeño impacto en el rendimiento (subjetivamente), lo cual es de esperar con un poco de E / S adicional, pero cuando habilito un registro de consulta general, veo un enorme impacto en el rendimiento (el doble del tiempo para ejecutar consultas, o peor), mucho más de lo que veo con binlogs. Por supuesto, ahora estoy registrando cada SELECT, así como cada UPDATE / INSERT, pero, otros demonios registran cada una de sus solicitudes (Apache, Exim) sin detenerse.

¿Solo estoy viendo los efectos de estar cerca de un "punto de inflexión" de rendimiento cuando se trata de E / S, o hay algo fundamentalmente difícil en el registro de consultas que hace que esto suceda? Me encantaría poder registrar todas las consultas para facilitar el desarrollo, pero no puedo justificar el tipo de hardware que parece que necesitaríamos para recuperar el rendimiento con el inicio de sesión de consulta general.

Por supuesto, registro consultas lentas, y hay una mejora insignificante en el uso general si desactivo esto.

(Todo esto está en Ubuntu 10.04 LTS, MySQLd 5.1.49, pero la investigación sugiere que este es un problema bastante universal)

James Green
fuente

Respuestas:

9

Los registros de consultas generales son mucho más IO que los registros binarios. Además del hecho de que la mayoría de los servidores SQL tienen lecturas del 90% al 10% de escrituras, los registros binarios se almacenan en formato binario en lugar de texto sin formato que utiliza menos espacio en disco. (¿Cuánto menos espacio? No estoy seguro. Lo siento).

Hay dos aspectos por los cuales Apache y Exim pueden registrar cada solicitud sin un impacto significativo en el rendimiento. La primera es que registran el hecho de que se realizó una solicitud, pero lo que ponen en el registro suele ser significativamente menor que la solicitud real. Una solicitud HTTP a menudo es dos veces más grande que la línea que va en el registro e incluso un correo electrónico de texto simple y corto es 10 o 20 veces más grande que la línea de registro que lo acompaña. Un correo electrónico con un archivo adjunto de 10 MB solo tendrá algunas líneas escritas en el registro.

La segunda parte de esto es que, en una aplicación web normal, generalmente hay docenas de consultas SQL asociadas con una sola página HTTP. Los correos electrónicos tienden a llegar en números aún más pequeños que las solicitudes HTTP. Su servidor MySQL probablemente esté intentando registrar mucho más que Apache o Exim.

Mire el tamaño (sin comprimir) de sus registros binarios y generales de MySQL y sus registros de Apache y Exim al final del día. Apuesto a que el registro general de MySQL es el más grande por un factor de al menos 5.

Ladadadada
fuente
1
Algunos puntos positivos: en particular, sí, un solo GET a nuestra aplicación puede causar cientos de SELECT, ya que aunque intentamos hacer todo lo posible en una sola consulta, a veces intercambiamos el rendimiento / limpieza de esto por estructura más elegante, código más legible y una base de datos más limpia. (Por otro lado, todo esto realmente comenzó hablando del contenido de registro de POST y de la URL de GET, ya que vemos los parámetros que CGI.pm ve en un caso y no en el otro, y desde allí en el registro / rendimiento en general). De todos modos, han pasado unas horas, así que, la respuesta fue aceptada ¡Gracias!
James Green
4

Para agregar a la respuesta proporcionada , también verá un impacto en el rendimiento si está iniciando sesión en el mismo dispositivo en el que residen sus almacenes de datos MySQL: si es el mismo disco, va a leer y escribir en múltiples ubicaciones todo el tiempo, ralentizando todo el proceso.

Esto es cierto incluso si se trata de una partición diferente en el mismo disco físico.

Si el registro va a un dispositivo diferente, eso debería aliviar algunos de los problemas de rendimiento.

madriguera
fuente
1
No es relevante para mi situación: es una máquina virtual alojada y las bases de datos están en un volumen lógico separado para / var, proporcionado a su vez desde la misma matriz de almacenamiento. Supongo que en teoría podrían estar en los mismos ejes, pero se sentiría como una gran coincidencia :-) Dicho esto, +1 a un lado, porque esto sería absolutamente relevante para alguien con, por ejemplo, una configuración predeterminada de Debian / Ubuntu (DBs en / var / mysql, inicia sesión / var / log)!
James Green
@ jimbo - gracias por los accesorios, incluso si no es directamente aplicable a su situación particular :)
warren