Las bases de datos desempeñan un rol fundamental en el rendimiento de cualquier aplicación. La base de datos MySQL no es una excepción. Por lo tanto, es importante comprender las distintas maneras en que el ajuste, el diseño y la configuración de la base de datos pueden ayudar a mejorar el rendimiento de la aplicación. A continuación, se muestran algunas formas en las que MySQL puede optimizarse para lograr un rendimiento óptimo.
Ajuste de consultas
El ajuste del rendimiento de la base de datos comienza desde la aplicación. La manera en que la aplicación traduce los requisitos empresariales a las consultas de la base de datos marca una gran diferencia en la complejidad y la eficiencia de la aplicación. La medida real del rendimiento es la eficacia con la que cada instancia de base de datos contribuye a las necesidades empresariales.
Diseño de esquemas
La manera en que se definen las entidades y relaciones en una base de datos relacional determina qué tan sencilla o compleja será una respuesta a una consulta de base de datos. Además, la forma en que se definen la clave primaria y los índices secundarios cumple un rol importante.
Configuración del servidor
La configuración del servidor es responsable de optimizar y maximizar la utilización de los recursos del sistema. Los recursos del sistema son los núcleos de la unidad de procesamiento principal (CPU), la memoria de la máquina física o la máquina virtual (VM), el sistema de almacenamiento subyacente y la red.
Ajuste dinámico del servidor
Supervisión, optimización y ajuste del rendimiento continuos para adaptar las cargas de trabajo de la base de datos a la dinámica del mundo real.
Este artículo se centra en el ajuste de consultas. El resto de los temas se abordarán en artículos posteriores.
A menudo, comenzamos el proceso de ajuste de consultas observando la consulta de la base de datos. Una manera mejor sería comenzar con la evaluación de la eficiencia con la que la solicitud empresarial se convirtió en una consulta a la base de datos. La interpretación y el procesamiento de una necesidad empresarial en una consulta determina qué tan pequeño o grande sería el costo.
El primer paso es priorizar las consultas que se optimizarán:
Estas dos categorías deben optimizarse durante el diseño del esquema de la base de datos.
Una transacción es una unidad lógica en la que todas las declaraciones contenidas se confirmarían por completo o se revertirían. Las transacciones son las características que proporcionan atomicidad, coherencia, aislamiento y durabilidad (ACID, por sus siglas en inglés) para MySQL.
En InnoDB, el motor de almacenamiento para MySQL, todas las actividades del usuario se producen dentro de una transacción. De forma predeterminada, el modo de confirmación automática está habilitado, lo que significa que cada instrucción de SQL forma una sola transacción por sí misma. Para realizar una transacción de varias declaraciones cuando la confirmación automática está habilitada, inicia la transacción de forma explícita con START_TRANSACTION o START_TRANSACTION y finalízala con START_TRANSACTION o START_TRANSACTION. Si el modo de confirmación automática está inhabilitado, la sesión siempre tiene una transacción abierta hasta que un COMMIT o COMMIT la finaliza y comienza una nueva.
Se recomienda que las transacciones sean lo más cortas posible. Esto se debe a que las transacciones largas tienen varias desventajas, como se detalla más adelante en este artículo.
1. Contenciones de bloqueo prolongadas, que causan consultas más lentas y posibles fallas de las consultas
2. Rendimiento degradado del servidor debido a la gran cantidad de registros de deshacer
3. Aumento del uso del disco
4. Prolongación del tiempo de cierre
5. Prolongación del tiempo de recuperación ante fallas
Las consultas se pueden capturar en la aplicación o en la base de datos.
Una práctica recomendada para el desarrollo es registrar las consultas de bases de datos y el tiempo de ejecución de las consultas. El registro en la aplicación facilita la evaluación de la eficacia y la eficiencia de las consultas en su contexto empresarial. Por ejemplo, los usuarios pueden registrar el tiempo de respuesta de cada consulta o el tiempo de respuesta de algunas funcionalidades. Esta también es una manera fácil de obtener el tiempo total de ejecución para las transacciones de varias declaraciones.
Además, el tiempo de respuesta de la consulta medido a partir del registro de la aplicación es una medición de extremo a extremo, incluido el tiempo de red. Esto complementa el tiempo de ejecución de la consulta registrado desde la base de datos y facilita identificar si el problema se relaciona con la red o con la base de datos.
Estadísticas de consultas de MySQL en Cloud SQL
La herramienta Estadísticas de consultas de Cloud SQL permite capturar, supervisar y diagnosticar consultas.
Las estadísticas de consultas facilitan la búsqueda de las consultas principales según el tiempo de ejecución y la frecuencia de ejecución.
La herramienta tiene opciones de filtrado, como intervalo de tiempo, base de datos, cuenta de usuario y dirección del cliente. Tiene gráficos que muestran el uso de la CPU, y un desglose de esperas de bloqueo y E/S. En la tabla “Consultas y etiquetas principales”, se enumeran las consultas principales por tiempo de ejecución y se normalizan las consultas. Además del tiempo de ejecución, incluye estadísticas sobre el “promedio de filas analizadas” y el “promedio de filas mostradas”, que brindan estadísticas sobre la eficiencia de las consultas.
Consulta la documentación para ver todo lo que ofrece y cómo habilitarla.
Usa performance_schema
En Cloud SQL para MySQL, la función performance_schema está habilitada de forma predeterminada en las versiones 8.0.26 y posteriores de MySQL con más de 15 GB de memoria. Para habilitarla o inhabilitarla, es necesario reiniciar la instancia.
Cuando performance_schema=ON, los instrumentos de declaración de consultas están habilitados de forma predeterminada. En la tabla sys.statement_analysis, se proporcionan estadísticas agregadas para consultas normalizadas. Estas responden preguntas como las siguientes:
Si usas MySQL Workbench, tendrá informes de esquema de rendimiento basados en la vista del sistema. El informe tiene una sección sobre "instrucciones de SQL de alto costo" que proporciona estadísticas sobre el rendimiento de las consultas.
Usa el registro de consultas lentas + herramientas
El registro de consultas lentas captura todas las consultas que se ejecutan por un tiempo mayor que long_query_time. También registra el tiempo de ejecución de las consultas, el tiempo de bloqueo, las filas de datos examinadas y las filas de datos enviadas. Las estadísticas de ejecución adicionales lo convierten en un candidato preferido para analizar las consultas de base de datos en lugar de usar el registro general.
Se recomienda habilitar el registro de consultas lentas. Por lo general, el valor de long_query_time debe mantenerse en un umbral razonable para capturar las consultas que pretendes observar y optimizar.
log_output=FILE
slow_query_log=ON
long_query_time=2
De vez en cuando, es una buena idea configurar long_query_time=0 para capturar todas las consultas durante un período breve y obtener una descripción general del volumen y el rendimiento de las consultas.
Existen herramientas, como mysqldumpslow y pt-query-digest, que extraen las firmas de las consultas y generan un informe que muestra las estadísticas de consultas.
Existen otras herramientas de supervisión de terceros que generan informes sobre las estadísticas de consultas, como Percona Monitoring and Management, SolarWinds Database Performance Monitor (anteriormente VividCortex) y más.
Después de capturar las consultas en transacciones, el siguiente paso es optimizarlas.
El comando EXPLAIN proporciona el plan de ejecución de consultas y, a partir de la versión 8.0.18, el comando EXPLAIN ANALYZE ejecutará una declaración y producirá un resultado EXPLAIN junto con los tiempos de la ejecución.
Las estadísticas de consultas de MySQL proporcionan acceso práctico al plan EXPLAIN.
¿Qué buscamos en el resultado?
Las variables de estado de la sesión se pueden usar para obtener detalles de la ejecución de la consulta.
Primero, borra las variables de la sesión y, luego, ejecuta la consulta y examina los contadores. Por ejemplo, el estado Handler_* muestra el patrón de acceso a los datos y la cantidad de filas. El estado Created_* se mostraría si se crea una tabla temporal o una temporal en el disco. El campo Sort_* mostraría la cantidad de pases de combinación de ordenamiento y la cantidad de filas ordenadas. En la documentación, se explican más variables de sesión.
La instrucción SHOW PROFILE proporciona el tiempo de ejecución de la consulta por etapa de ejecución, que también podría ser información útil.
Una vez que se comprende el plan de ejecución de consultas, existen varias formas de influir en él y optimizarlo.
A fin de optimizar la configuración del servidor para ciertas consultas, se recomienda usar las variables a nivel de sesión en lugar de cambiar el valor global que afecta a todas las sesiones.
Los valores de sesión más utilizados son los siguientes:
En resumen, para el ajuste de consultas, hablamos de tres aspectos:
Comienza a desarrollar en Google Cloud con el crédito gratis de $300 y los más de 20 productos del nivel Siempre gratuito.