Trabajo en una gran aplicación web que utiliza una base de datos MySQL 5.0 con tablas InnoDB. Dos veces en los últimos meses, hemos experimentado el siguiente escenario:¿Cómo predecir los puntos de inflexión de MySQL?
- El servidor de base de datos funciona bien durante semanas, con poca carga y pocas consultas lentas.
- Una consulta frecuente que se ejecutó rápidamente de repente comenzará a ejecutarse muy lentamente.
- Picos de carga en la base de datos y el sitio se cuelga.
La solución en ambos casos fue encontrar la consulta lenta en el registro lento de consultas y crear un nuevo índice en la tabla para acelerarlo. Después de aplicar el índice, el rendimiento de la base de datos volvió a ser normal.
Lo que es más frustrante es que, en ambos casos, no tuvimos ninguna advertencia sobre la inminente fatalidad; todos nuestros sistemas de monitoreo (por ejemplo, gráficos de carga del sistema, uso de CPU, tasas de ejecución de consultas, consultas lentas) nos dijeron que el servidor de la base de datos estaba en buen estado.
Pregunta n. ° 1: ¿Cómo podemos predecir este tipo de puntos de inflexión o evitarlos por completo?
Una cosa que no estamos haciendo con regularidad es ejecutar OPTIMIZE TABLE o ANALYZE TABLE. Nos ha costado encontrar una buena regla general sobre la frecuencia (si es que lo hemos hecho alguna vez) para hacer estas cosas manualmente. (Dado que estos comandos LOCK tablas, no queremos ejecutarlos indiscriminadamente.) ¿Estos escenarios suenan como el resultado de tablas no optimizadas?
Pregunta n. ° 2: ¿Deberíamos ejecutar OPTIMIZE o ANALYZE manualmente? Si es así, ¿con qué frecuencia?
Más detalles sobre la aplicación: el patrón de uso de la base de datos es aproximadamente 95% lecturas, 5% escrituras; la base de datos ejecuta alrededor de 300 consultas/segundo; la tabla utilizada en las consultas lentas fue la misma en ambos casos y tiene cientos de miles de registros.