MySQL (y su fork MariaDB) alimenta millones de sitios web, incluidos Facebook, Twitter y YouTube en sus primeras versiones. Aprender a instalarlo, configurarlo y administrarlo es una habilidad fundamental para cualquier desarrollador o administrador de sistemas.
MySQL vs MariaDB
MariaDB es un fork de MySQL creado por el fundador original de MySQL (Michael "Monty" Widenius) cuando Oracle compró MySQL en 2010. Es 100% compatible con MySQL pero con algunas funciones adicionales y sin la influencia corporativa de Oracle. Para la mayoría de casos de uso, son intercambiables. Este tutorial aplica para ambos.
Instalación
# Ubuntu/Debian
sudo apt install mariadb-server mariadb-client
# CentOS/Rocky Linux
sudo dnf install mariadb-server mariadb
# Arrancar y habilitar
sudo systemctl enable --now mariadb
# Verificar
sudo systemctl status mariadb
# Configuración segura inicial (muy recomendado)
sudo mysql_secure_installation
# Te pregunta: contraseña root, eliminar usuarios anónimos,
# deshabilitar login root remoto, eliminar test database
Acceso y administración básica
# Conectar como root
sudo mysql -u root -p
# Crear usuario de aplicación (NUNCA usar root en la app)
MariaDB> CREATE USER 'solutions_user'@'localhost' IDENTIFIED BY 'contraseña_segura';
# Crear base de datos
MariaDB> CREATE DATABASE solutions_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Dar permisos solo a esa base de datos
MariaDB> GRANT ALL PRIVILEGES ON solutions_db.* TO 'solutions_user'@'localhost';
MariaDB> FLUSH PRIVILEGES;
# Verificar permisos
MariaDB> SHOW GRANTS FOR 'solutions_user'@'localhost';
💡 utf8mb4 vs utf8: En MySQL/MariaDB, el charset "utf8" es en realidad utf8 de 3 bytes — no soporta emojis ni muchos caracteres asiáticos. Siempre usa
utf8mb4 para Unicode completo. El collation utf8mb4_unicode_ci hace búsquedas case-insensitive.
Conectar desde PHP con PDO
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // prepared statements reales
];
try {
$pdo = new PDO($dsn, 'solutions_user', 'contraseña_segura', $opciones);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int) $e->getCode());
}
// Query con prepared statement (protección contra SQL injection)
$stmt = $pdo->prepare('SELECT * FROM articulos WHERE categoria_slug = ? LIMIT ?');
$stmt->execute(['redes', 10]);
$articulos = $stmt->fetchAll();
Administración del día a día
# Ver bases de datos
SHOW DATABASES;
# Ver tablas en la BD actual
USE solutions_db;
SHOW TABLES;
# Ver estructura de una tabla
DESCRIBE articulos;
SHOW CREATE TABLE articulos;
# Ver procesos activos
SHOW PROCESSLIST;
# Ver variables de configuración
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
# Ver el estado del servidor
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Queries';
Backup y restauración
# Backup completo
mysqldump -u root -p solutions_db > backup_$(date +%Y%m%d).sql
# Backup con estructura y datos de todas las BDs
mysqldump -u root -p --all-databases > backup_total.sql
# Restaurar
mysql -u root -p solutions_db < backup_20250626.sql
# Backup automático con cron (diario a las 2 AM)
0 2 * * * mysqldump -u backup_user -ppassword solutions_db | gzip > /backups/db_$(date +\%Y\%m\%d).sql.gz
Configuración de rendimiento (my.cnf)
[mysqld]
# Buffer pool: 70-80% de la RAM disponible para el servidor DB
innodb_buffer_pool_size = 1G
# Log de queries lentas (para optimización)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # queries que tarden más de 2 segundos
# Conexiones máximas
max_connections = 200
# Charset por defecto
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
✅ Mejores prácticas: Nunca usar root en la aplicación · Una base de datos por proyecto · Backups automáticos diarios verificados · Índices en columnas WHERE y JOIN frecuentes · EXPLAIN SELECT antes de poner en producción una query pesada · slow_query_log habilitado en producción
"Una base de datos mal configurada puede hacer que tu aplicación rápida parezca lenta. Una bien configurada puede hacer que una aplicación mediocre parezca veloz."