MySQL: instalación y primeros pasos
Guía completa de instalación, configuración y primeros pasos con MySQL. Aprende a crear bases de datos, tablas, usuarios y a ejecutar consultas desde cero.
Introducción
MySQL es el sistema gestor de bases de datos relacional (SGBD) open-source más popular del mundo. Creado por MySQL AB en 1995 y adquirido posteriormente por Sun Microsystems (hoy Oracle), es el motor de datos detrás de millones de aplicaciones web. MySQL forma parte del stack LAMP (Linux, Apache, MySQL, PHP/Python/Perl), el estándar de facto para el desarrollo web durante décadas.
Aunque PostgreSQL ha ganado terreno en los últimos años, MySQL sigue siendo la opción predilecta para proyectos que priorizan velocidad de lectura, replicación sencilla y un ecosistema maduro de herramientas. Es usado por empresas como Meta, Netflix y Airbnb.
Instalación
MySQL está disponible en todos los sistemas operativos principales. Aquí tienes las formas más comunes de instalarlo:
macOS (Homebrew)
brew install mysql
brew services start mysqlDocker
La forma más limpia y aislada de ejecutar MySQL, ideal para desarrollo:
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
-d mysql:8Linux (Ubuntu/Debian)
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysqlVerificar la instalación
Una vez instalado, comprueba que todo funciona correctamente:
mysql --version
# mysql Ver 8.0.36 for macos14 on x86_64 (Homebrew)Primeros comandos
Conéctate al servidor MySQL como usuario root y empieza a explorar:
mysql -u root -p
-- Te pedirá la contraseña que configuraste
CREATE DATABASE mi_proyecto;
USE mi_proyecto;
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mi_proyecto.* TO 'dev'@'localhost';
FLUSH PRIVILEGES;
-- Ver bases de datos y tablas
SHOW DATABASES;
SHOW TABLES;
DESCRIBE nombre_tabla;Tipos de datos en MySQL
MySQL ofrece una amplia variedad de tipos de datos. Conocerlos es clave para diseñar esquemas eficientes:
- Numéricos:
INT,BIGINT,DECIMAL(10,2),FLOAT,BOOLEAN(en realidadTINYINT(1)) - Cadenas:
VARCHAR(255),TEXT,CHAR(n),ENUM('a','b') - Fecha/Hora:
DATETIME,TIMESTAMP,DATE,TIME,YEAR - Especiales:
JSON(validado pero no tan potente como JSONB de PostgreSQL),SET,BLOB
SERIAL nativo (usa AUTO_INCREMENT), no soporta arrays nativos, y aunque soporta JSON, no tiene un equivalente a JSONB con índices GIN. Sin embargo, MySQL es generalmente más rápido en operaciones simples de lectura.CREATE TABLE con detalles MySQL
La creación de tablas en MySQL incluye opciones específicas del motor de almacenamiento. Aquí un ejemplo completo:
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(150) NOT NULL,
precio DECIMAL(10,2) NOT NULL,
categoria ENUM('electronica', 'ropa', 'hogar') DEFAULT 'electronica',
stock INT DEFAULT 0 CHECK (stock >= 0),
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;La cláusula ENGINE define el motor de almacenamiento:
- InnoDB — el motor por defecto desde MySQL 5.5. Soporta transacciones (ACID), claves foráneas, row-level locking y recuperación ante fallos. Es la opción recomendada para la mayoría de los casos.
- MyISAM — más antiguo, no soporta transacciones ni FKs, pero ofrece búsquedas full-text nativas (sin necesidad de motores externos). Fue el motor por defecto antes de MySQL 5.5.
- MEMORY — almacena los datos en RAM, ideal para tablas temporales o cachés. Los datos se pierden al reiniciar el servidor.
El charset utf8mb4 es el estándar actual. Soporta caracteres Unicode completos, incluyendo emojis. Usa siempre utf8mb4 en lugar del obsoleto utf8 (que solo soporta 3 bytes).
NOT NULL en campos obligatorios y valores por defecto donde tenga sentido. Esto evita sorpresas y mejora el rendimiento de las consultas.Schema completo de ejemplo
Un sistema real de e-commerce con cuatro tablas relacionadas mediante claves foráneas:
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(150) NOT NULL,
precio DECIMAL(10,2) NOT NULL,
categoria ENUM('electronica', 'ropa', 'hogar') DEFAULT 'electronica',
stock INT DEFAULT 0,
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT NOT NULL,
total DECIMAL(12,2) NOT NULL,
estado ENUM('pendiente', 'enviado', 'entregado') DEFAULT 'pendiente',
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE detalle_pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
pedido_id INT NOT NULL,
producto_id INT NOT NULL,
cantidad INT NOT NULL CHECK (cantidad > 0),
precio_unitario DECIMAL(10,2) NOT NULL,
FOREIGN KEY (pedido_id) REFERENCES pedidos(id)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (producto_id) REFERENCES productos(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;Consultas útiles con el schema
-- Total gastado por cada usuario
SELECT u.nombre, SUM(p.total) AS total_gastado
FROM usuarios u
JOIN pedidos p ON u.id = p.usuario_id
GROUP BY u.id, u.nombre
ORDER BY total_gastado DESC;
-- Productos más vendidos
SELECT pr.nombre, SUM(dp.cantidad) AS unidades_vendidas
FROM detalle_pedidos dp
JOIN productos pr ON dp.producto_id = pr.id
GROUP BY pr.id, pr.nombre
ORDER BY unidades_vendidas DESC
LIMIT 10;Herramientas para MySQL
Más allá de la terminal, existen herramientas gráficas que facilitan el trabajo diario:
- MySQL Workbench — la herramienta oficial de Oracle. Incluye modelado ER, administración de servidores y editor de consultas. Gratuita y multiplataforma.
- TablePlus — cliente moderno con interfaz limpia. Soporta MySQL, PostgreSQL, Redis y más. Rápido, con atajos de teclado y multi-pestaña. De pago, pero con prueba gratuita.
- DBeaver — cliente universal open-source. Soporta decenas de bases de datos, incluyendo MySQL. Ideal si trabajas con múltiples motores.
- phpMyAdmin — interfaz web clásica, preinstalada en muchos entornos de hosting compartido. Sencilla pero funcional.
Ejercicios prácticos
Pon a prueba lo aprendido con estos ejercicios. Intenta resolverlos por tu cuenta antes de mirar la solución.