Introducción a los motores de almacenamiento

MySQL tiene una característica que lo diferencia de la mayoría de los sistemas de bases de datos relacionales: su arquitectura de motores de almacenamiento intercambiables. Mientras que otros gestores como PostgreSQL o SQL Server utilizan un único mecanismo interno para almacenar y recuperar datos, MySQL permite elegir entre varios motores distintos, cada uno con sus propias características, ventajas y limitaciones. Esta flexibilidad significa que puedes optimizar el almacenamiento tabla por tabla según las necesidades específicas de cada parte de tu aplicación.

Un motor de almacenamiento es el componente de MySQL responsable de gestionar cómo se guardan los datos en disco, cómo se leen, cómo se manejan los bloqueos y las transacciones, y cómo se mantienen los índices. El servidor MySQL se encarga del análisis sintáctico de las consultas, la optimización y la comunicación con el cliente, pero delega las operaciones de lectura y escritura física al motor de almacenamiento de cada tabla.

Sintaxis

Para especificar el motor de almacenamiento al crear una tabla, se utiliza la cláusula ENGINE:

CREATE TABLE nombre_tabla (
    columna1 tipo_dato,
    columna2 tipo_dato
) ENGINE = nombre_motor;

Para cambiar el motor de una tabla existente:

ALTER TABLE nombre_tabla ENGINE = nombre_motor;

Para consultar qué motores están disponibles en tu servidor:

SHOW ENGINES;

Comportamiento básico

MySQL incluye varios motores de almacenamiento compilados en el servidor. No todos están habilitados por defecto, y la disponibilidad puede variar según la distribución y la versión que utilices. El comando SHOW ENGINES te muestra exactamente cuáles están disponibles:

SHOW ENGINES;
EngineSupportCommentTransactionsXASavepoints
InnoDBDEFAULTSupports transactions, row-level locking, and foreign keysYESYESYES
MyISAMYESMyISAM storage engineNONONO
MEMORYYESHash based, stored in memory, useful for temporary tablesNONONO
CSVYESCSV storage engineNONONO
ARCHIVEYESArchive storage engineNONONO
BLACKHOLEYES/dev/null storage engine (anything you write disappears)NONONO
MRG_MYISAMYESCollection of identical MyISAM tablesNONONO

La columna Support indica el estado de cada motor. DEFAULT señala cuál es el motor predeterminado, que en MySQL 8.0 y versiones posteriores es InnoDB. YES indica que el motor está disponible y NO que está compilado pero deshabilitado.

Si creas una tabla sin especificar el motor, MySQL utiliza el motor predeterminado:

-- Estas dos sentencias son equivalentes en MySQL 8.0
CREATE TABLE pedidos (id INT PRIMARY KEY, total DECIMAL(10,2));
CREATE TABLE pedidos (id INT PRIMARY KEY, total DECIMAL(10,2)) ENGINE = InnoDB;

Para consultar qué motor utiliza una tabla existente:

SHOW TABLE STATUS WHERE Name = 'pedidos';

También puedes obtener esta información de forma más directa:

SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'tienda';
table_nameengine
pedidosInnoDB
productosInnoDB
log_accesosARCHIVE

Caso práctico: elegir el motor adecuado para cada tabla

En una aplicación real, no todas las tablas tienen las mismas necesidades. Una tabla de pedidos necesita transacciones y claves foráneas, mientras que una tabla de logs podría priorizar la compresión y la velocidad de escritura. Veamos cómo diseñar un esquema que aproveche diferentes motores.

-- Tabla principal de pedidos: necesita transacciones ACID y claves foráneas
CREATE TABLE pedidos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT NOT NULL,
    fecha DATETIME DEFAULT CURRENT_TIMESTAMP,
    total DECIMAL(10,2) NOT NULL,
    estado ENUM('pendiente', 'pagado', 'enviado', 'entregado'),
    FOREIGN KEY (cliente_id) REFERENCES clientes(id)
) ENGINE = InnoDB;
 
-- Tabla de sesiones temporales: datos volátiles que se pierden al reiniciar
CREATE TABLE sesiones_activas (
    session_id VARCHAR(64) PRIMARY KEY,
    usuario_id INT NOT NULL,
    datos JSON,
    ultimo_acceso TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE = MEMORY;
 
-- Tabla de auditoría: solo se insertan registros, nunca se modifican
CREATE TABLE auditoria_acciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario VARCHAR(50),
    accion VARCHAR(100),
    fecha DATETIME DEFAULT CURRENT_TIMESTAMP,
    detalle TEXT
) ENGINE = ARCHIVE;

Cada tabla utiliza el motor que mejor se adapta a su patrón de uso. InnoDB para datos críticos que necesitan consistencia, MEMORY para datos temporales de acceso ultrarrápido y ARCHIVE para registros históricos que solo crecen.

Caso práctico: cambiar el motor de una tabla existente

Si descubres que una tabla está usando un motor inadecuado, puedes cambiarlo con ALTER TABLE. Esta operación reconstruye la tabla completa copiando todos los datos al nuevo formato, por lo que puede tomar tiempo considerable en tablas grandes.

-- Verificar el motor actual
SELECT table_name, engine, table_rows
FROM information_schema.tables
WHERE table_schema = 'mi_app' AND table_name = 'historico_ventas';
table_nameenginetable_rows
historico_ventasMyISAM2450000
-- Cambiar a InnoDB para tener soporte transaccional
ALTER TABLE historico_ventas ENGINE = InnoDB;

Durante la conversión, MySQL crea una copia temporal de la tabla con el nuevo motor, copia todos los datos y luego reemplaza la tabla original. Para tablas con millones de filas, esta operación puede durar minutos u horas y bloqueará la tabla durante el proceso.

Para verificar que el cambio se realizó correctamente:

SELECT table_name, engine
FROM information_schema.tables
WHERE table_schema = 'mi_app' AND table_name = 'historico_ventas';
table_nameengine
historico_ventasInnoDB

Caso práctico: configurar el motor predeterminado

Si la mayoría de tus tablas deben usar un motor específico, puedes cambiar el motor predeterminado del servidor para evitar tener que especificarlo en cada CREATE TABLE.

Para cambiar el motor predeterminado de la sesión actual:

SET default_storage_engine = InnoDB;

Para configurarlo de forma permanente, añade la directiva al archivo de configuración my.cnf:

[mysqld]
default-storage-engine = InnoDB

Puedes verificar cuál es el motor predeterminado actual:

SELECT @@default_storage_engine;
@@default_storage_engine
InnoDB

En la gran mayoría de los casos, InnoDB es la elección correcta como motor predeterminado. Es el motor más maduro, con mejor soporte transaccional, y cubre las necesidades del 99% de las aplicaciones. Los otros motores tienen nichos específicos donde resultan más apropiados, pero deben usarse conscientemente y no por defecto.

Advertencia: Cambiar el motor de una tabla con ALTER TABLE es una operación costosa que reconstruye la tabla completa. En tablas grandes de producción, planifica esta operación durante ventanas de mantenimiento y considera usar herramientas como pt-online-schema-change de Percona para minimizar el tiempo de bloqueo.

Consejo: Si no estás seguro de qué motor elegir, usa InnoDB. Es el motor predeterminado por buenas razones: soporta transacciones, claves foráneas, recuperación ante fallos y ofrece un rendimiento excelente tanto en lectura como en escritura para la inmensa mayoría de cargas de trabajo.

En el siguiente artículo profundizaremos en InnoDB, el motor de almacenamiento predeterminado y más importante de MySQL.

Escrito por Eduardo Lázaro