Documentación/MySQL y MariaDB
MySQL y MariaDB
Base de datos relacional open-source popular.
De un vistazo
- Categoría — Relacional
- Query language — SQL
- Puerto por defecto — 3306
- Esquema de URI —
mysql
Funcionalidades
- Implementaciones de driver relacional para MySQL y MariaDB en un solo crate.
- Soporta ejecución de SQL, descubrimiento de schema, índices, foreign keys, constraints CHECK, y constraints UNIQUE.
- Soporta autenticación, túnel SSH, y modos de conexión URI/manual.
- TLS con los cinco modos SSL nativos (
DISABLED,PREFERRED,REQUIRED,VERIFY_CA,VERIFY_IDENTITY):VERIFY_CAverifica la cadena del servidor sin validar el hostname yVERIFY_IDENTITYverifica ambos. Una CA raíz personalizada reemplaza el trust store del sistema en los modos que verifican, y un certificado de cliente + clave habilita mutual TLS. Usa el backendrustls/aws-lc-rs. - Soporta cancelación de queries a través de un camino de cancelación dedicado
(flujo
KILL QUERY). - Incluye generación de SQL/código para CRUD, índices, foreign keys, y operaciones de DDL de tabla.
- Descubrimiento de routines: lista stored procedures y funciones definidas por
el usuario desde
information_schema.ROUTINESincluyendo tipos de parámetros y hints de tipo de retorno (solo Functions). - Definición de routines: obtiene el cuerpo completo de
CREATE FUNCTIONoCREATE PROCEDUREvíaSHOW CREATE FUNCTION/SHOW CREATE PROCEDURE(de solo lectura; la definición no es editable ni ejecutable en el visor). - Los scripts multi-sentencia (varias sentencias separadas por
;) se dividen y ejecutan sentencia por sentencia, cada una a través del camino preparado tipado, devolviendo un result set por sentencia. - Motor de transferencia de datos: carga masiva nativa multi-fila con
INSERT(BULK_INSERT), DDLCREATE TABLEnativo del driver a partir de las columnas de una tabla origen, soporte deTRUNCATE TABLE, y un toggle de integridad referencial (SET FOREIGN_KEY_CHECKS) para migraciones seguras con FK. Tanto MySQL como MariaDB comparten este soporte. - Envía el atributo de conexión
program_namecomodbflux/<version>, visible enperformance_schema.session_connect_attrs.
Instance Metrics
Expone un conjunto curado de métricas de servidor en vivo obtenidas de SHOW GLOBAL STATUS:
mysql.threads_connected— conexiones abiertas actualmentemysql.threads_running— queries en ejecución actualmentemysql.queries_per_sec— queries por segundo (contador acumulativo)mysql.innodb_buffer_pool_hit_ratio— eficiencia de lectura del buffer pool de InnoDBmysql.innodb_rows_read— filas leídas del storage engine InnoDBmysql.innodb_rows_inserted— filas insertadas en InnoDBmysql.innodb_rows_updated— filas actualizadas en InnoDBmysql.innodb_rows_deleted— filas eliminadas en InnoDBmysql.slow_queries— conteo acumulativo de slow queriesmysql.table_locks_waited— contador de contención de locks a nivel de tablamysql.bytes_sent— bytes de red enviados
Cada métrica se devuelve como una única fila (timestamp_ms, value) para
graficado en vivo.
Instance Inspector
Expone snapshots tabulares del estado del servidor en ejecución:
mysql.processlist— sesiones activas deinformation_schema.PROCESSLIST(user, host, db, command, time, state, info)
Limitaciones
-
Driver solo SQL; no expone APIs de documentos ni de key-value.
-
Instance Metrics devuelve un único dato por llamada (snapshot actual de
SHOW GLOBAL STATUS), no una serie temporal histórica. Los contadores acumulativos (p. ej.mysql.bytes_sent) crecen de forma monótona — interprétalos como deltas entre muestras en vez de tasas absolutas. -
El sondeo de disponibilidad de
performance_schemase ejecuta una vez al construir el catálogo. Cuandoperformance_schemano está presente, las métricas específicas de performance schema se omiten delist_metrics(). El conjunto de métricas estáticas (basado enSHOW GLOBAL STATUS) siempre está disponible. -
Un script multi-sentencia ejecuta cada sentencia secuencialmente en vez de como un único lote atómico del lado del servidor; la división de sentencias es basada en texto y puede dividir incorrectamente cuerpos de stored programs que contienen
;(p. ej.CREATE PROCEDURE ... BEGIN ... END). -
La cancelación depende de los permisos del servidor y el estado de la conexión cuando se emite
KILL QUERY. -
La generación de código está limitada a las construcciones MySQL/MariaDB soportadas; los IDs de generador no soportados devuelven
NotSupported. -
El listado de routines cubre solo los tipos FUNCTION y PROCEDURE. Las funciones agregadas de MySQL (registradas vía el plugin UDF
CREATE AGGREGATE FUNCTION) y las funciones window no aparecen eninformation_schema.ROUTINESy por lo tanto no se listan. -
SHOW CREATE FUNCTION/SHOW CREATE PROCEDURErequiere el privilegioSHOW_ROUTINE(MySQL 8.0+) o ser propietario de la rutina; sin privilegios suficientes la columna de definición devuelveNULLy el visor muestra un aviso en vez del código fuente.
Capacidades de DDL
DDL no transaccional
CRÍTICO: las operaciones de DDL en MySQL NO son transaccionales — no se pueden revertir con rollback:
BEGIN;
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL;
-- El DDL se confirma inmediatamente, ¡ROLLBACK no tiene efecto!
ROLLBACK; -- Demasiado tarde, la columna ya fue agregada
Excepción: RENAME TABLE es atómico (seguro de usar dentro de
transacciones).
Comportamiento de ALTER TABLE
Reescrituras de tabla:
- La mayoría de las operaciones
ALTER TABLEreescriben toda la tabla (bloquea la tabla durante la operación) - Usa
ALGORITHM=INPLACEyLOCK=NONEpara DDL online (MySQL 5.6+):ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL, ALGORITHM=INPLACE, LOCK=NONE;
Agregar columnas:
- Agregar columna al final de la tabla: rápido (solo metadata)
- Agregar columna en medio de la tabla: reescritura de tabla (bloquea la tabla)
- Usa
AFTER column_namepara controlar la posición
Agregar columnas con defaults:
- Reescritura de tabla (bloquea la tabla)
- El valor por defecto se escribe en todas las filas existentes
Cambiar tipos de columna:
- Siempre requiere reescritura de tabla (bloquea la tabla)
- La conversión de datos ocurre durante la reescritura
Eliminar columnas:
- Reescritura de tabla (bloquea la tabla)
- Los datos se eliminan inmediatamente
Renombrar columnas:
- Reescritura de tabla (bloquea la tabla)
- Puede romper vistas, triggers, y código de la aplicación
Operaciones de índice
CREATE INDEX:
- Bloquea la tabla para escrituras (lecturas permitidas)
- Usa
ALGORITHM=INPLACE, LOCK=NONEpara creación de índices online:CREATE INDEX idx_users_email ON users(email) ALGORITHM=INPLACE, LOCK=NONE;
DROP INDEX:
- Bloquea la tabla para escrituras (lecturas permitidas)
- Usa
ALGORITHM=INPLACE, LOCK=NONEpara eliminación de índices online
Constraints
Foreign keys:
- Agregar foreign keys escanea ambas tablas (bloquea ambas)
- Usa
ALGORITHM=INPLACE, LOCK=NONEcuando sea posible
Constraints UNIQUE:
- Requiere creación de índice (bloquea la tabla)
Constraints CHECK (MySQL 8.0.16+):
- Solo metadata (rápido)
- Validado solo en INSERT/UPDATE
DDL online (MySQL 5.6+)
Opciones de ALGORITHM:
INPLACE— modifica la tabla en su lugar (sin copia)COPY— crea una nueva tabla y copia las filas (por defecto en versiones antiguas de MySQL)INSTANT— solo metadata (MySQL 8.0+, operaciones limitadas)
Opciones de LOCK:
NONE— permite lecturas y escrituras concurrentesSHARED— permite lecturas, bloquea escriturasEXCLUSIVE— bloquea lecturas y escrituras
Ejemplo:
ALTER TABLE users
ADD COLUMN phone VARCHAR(20) NULL,
ALGORITHM=INPLACE,
LOCK=NONE;
Limitaciones conocidas
- El DDL no es transaccional (no se puede revertir con rollback)
- La mayoría de las operaciones
ALTER TABLEreescriben toda la tabla (bloquea la tabla) - Agregar una columna en medio de la tabla requiere reescritura
- El soporte de DDL online varía según la versión de MySQL
- Usa
pt-online-schema-change(Percona Toolkit) para DDL sin downtime en tablas grandes
Buenas prácticas
- Prueba primero en una copia — el DDL no se puede revertir con rollback
- Usa DDL online — agrega
ALGORITHM=INPLACE, LOCK=NONEcuando esté soportado - Planifica ventanas de mantenimiento — ejecuta el DDL en periodos de bajo tráfico
- Monitorea el tamaño de la tabla — las tablas grandes tardan más en reescribirse
- Usa pt-online-schema-change — para DDL sin downtime en tablas de producción