Tecnología que te entiende
MySQL para principiantes: instalación, administración y PHP
Bases de datos

MySQL para principiantes: instalación, administración y PHP

20 Jan 2026 1 min de lectura 883 vistas

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."