Preguntas Específicas por Rol (Desarrollador, DBA, DevOps)
Desarrollador: ¿Cómo manejas los problemas de consulta N+1 en tu aplicación al interactuar con MySQL?
Respuesta:
El problema de consulta N+1 ocurre al recuperar una lista de registros padre, y luego ejecutar una consulta separada por cada padre para recuperar sus registros hijos relacionados. Abordo esto utilizando operaciones JOIN (por ejemplo, LEFT JOIN) para recuperar todos los datos necesarios en una sola consulta, o utilizando mecanismos de carga ansiosa (eager loading) proporcionados por los ORM para pre-recuperar datos asociados.
Desarrollador: Explica la diferencia entre los tipos de datos CHAR y VARCHAR en MySQL.
Respuesta:
CHAR es un tipo de cadena de longitud fija, que rellena los valores más cortos con espacios hasta su longitud definida. Es más rápido para datos de longitud fija pero puede desperdiciar espacio. VARCHAR es un tipo de cadena de longitud variable, que almacena solo los caracteres ingresados más un byte de longitud. Es más eficiente en espacio para longitudes de cadena variables pero puede ser ligeramente más lento debido a los cálculos de longitud.
DBA: ¿Cuál es el propósito del parámetro innodb_buffer_pool_size y cómo sueles dimensionarlo?
Respuesta:
El parámetro innodb_buffer_pool_size define el área de memoria donde InnoDB almacena en caché los datos e índices. Es crucial para el rendimiento, ya que reduce la E/S de disco. Normalmente lo dimensiono al 50-80% de la RAM disponible en un servidor MySQL dedicado, asegurando que quede suficiente memoria para el sistema operativo y otros procesos.
DBA: Describe los pasos que tomarías para solucionar un problema de alta utilización de CPU en un servidor MySQL.
Respuesta:
Comenzaría revisando SHOW PROCESSLIST para ver consultas de larga duración y SHOW ENGINE INNODB STATUS para la contención de mutex. Luego, analizaría la salida de pt-query-digest del log de consultas lentas para identificar consultas problemáticas. Finalmente, examinaría las métricas a nivel del sistema operativo (por ejemplo, top, vmstat) para descartar problemas no relacionados con MySQL.
DBA: ¿Cuándo elegirías usar una PRIMARY KEY en lugar de un índice UNIQUE?
Respuesta:
Una PRIMARY KEY identifica de forma única cada fila, impone NOT NULL y solo puede haber una por tabla. Es el índice agrupado (clustered index) para las tablas InnoDB, dictando el orden de almacenamiento físico. Un índice UNIQUE también impone unicidad pero permite valores NULL (múltiples NULL si no se especifica NOT NULL) y una tabla puede tener múltiples índices UNIQUE. Elige PRIMARY KEY para el identificador principal, UNIQUE para otras restricciones de unicidad.
DevOps: ¿Cómo automatizas las copias de seguridad de MySQL y aseguras su recuperabilidad?
Respuesta:
Automatizo las copias de seguridad usando mysqldump para copias de seguridad lógicas o Percona XtraBackup para copias de seguridad físicas en caliente de InnoDB. Estas se programan a través de cron jobs. Para asegurar la recuperabilidad, las copias de seguridad se almacenan fuera del sitio y realizo regularmente restauraciones de prueba en un entorno separado para validar su integridad y el proceso de recuperación.
DevOps: Explica cómo implementarías una configuración de MySQL de alta disponibilidad.
Respuesta:
Para alta disponibilidad, típicamente usaría la replicación de MySQL (Master-Slave o Group Replication) para redundancia de datos y failover. Un balanceador de carga (por ejemplo, ProxySQL, HAProxy) se colocaría delante para dirigir el tráfico y detectar fallos. Orchestrator o MHA se pueden usar para la gestión automatizada de failover.
Respuesta:
binlog_format determina cómo se escriben los cambios en el log binario. STATEMENT registra sentencias SQL, ROW registra cambios a nivel de fila y MIXED usa una combinación. El formato ROW es generalmente preferido por su fiabilidad y para evitar problemas de replicación no deterministas, especialmente con consultas complejas o UDFs.
Desarrollador: ¿Cómo previenes las vulnerabilidades de inyección SQL en tu aplicación?
Respuesta:
Prevengo la inyección SQL utilizando consultas parametrizadas o sentencias preparadas. Esto separa el código SQL de los datos proporcionados por el usuario, asegurando que la entrada se trate como valores literales en lugar de código ejecutable. Los ORM suelen manejar esto automáticamente, pero es crucial ser consciente del mecanismo subyacente.
Respuesta:
Uso EXPLAIN para analizar el plan de ejecución de una consulta lenta. Busco el type (por ejemplo, ALL indica un escaneo completo de tabla, ref o eq_ref son buenos), rows (número de filas examinadas), Extra (por ejemplo, 'Using filesort', 'Using temporary') y si los índices se están utilizando de manera efectiva. Esto ayuda a identificar índices faltantes o ineficientes.
DevOps: ¿Cómo monitoreas el rendimiento de MySQL en un entorno de producción?
Respuesta:
Monitoreo el rendimiento de MySQL utilizando una combinación de herramientas. Prometheus con MySQL Exporter proporciona métricas como QPS, conexiones, tasa de aciertos del buffer pool. Percona Monitoring and Management (PMM) ofrece información detallada sobre consultas, métricas del sistema operativo y estado de InnoDB. También configuro alertas para umbrales críticos como alto uso de CPU, bajo espacio en disco o consultas lentas.