MySQL desde Cero

Guía completa para aprender MySQL desde fundamentos hasta conceptos avanzados.

¿Qué es MySQL?

🗄️

Sistema de Gestión de Bases de Datos

MySQL es un sistema de gestión de bases de datos relacional de código abierto, uno de los más populares del mundo para aplicaciones web.

Para Qué Sirve

Se utiliza para almacenar y gestionar datos en aplicaciones web, sistemas empresariales, e-commerce y aplicaciones móviles.

🔧

Características Principales

Soporta transacciones ACID, stored procedures, triggers, vistas, replicación y clustering para alta disponibilidad.

💡 ¿Sabías qué?

MySQL fue creado en 1995 por Michael Widenius y David Axmark. Su nombre proviene de la hija de Widenius, My. El símbolo del delfín se llama "Sakila".

Arquitectura de MySQL

MySQL utiliza una arquitectura cliente-servidor con múltiples motores de almacenamiento intercambiables.

Cliente / Aplicación

MySQL Workbench, aplicaciones web, CLI

⬇️

MySQL Server

Parser, Optimizer, Executor

⬇️

Storage Engine

InnoDB, MyISAM, Memory, etc.

⬇️

Datos Físicos

Archivos en disco, logs, buffers

📊 Storage Engines

  • InnoDB - Transaccional, row-level locking
  • MyISAM - Lectura rápida, sin transacciones
  • Memory - Datos en RAM, muy rápido
  • Archive - Para grandes volúmenes de datos

💾 Componentes

  • Connection Pool - Gestión de conexiones
  • Query Cache - Caché de consultas
  • Buffer Pool - Caché de InnoDB
  • Redo Log - Log de transacciones

🔒 Características

  • ACID compliance - Transacciones seguras
  • Foreign keys - Integridad referencial
  • Replication - Réplica maestro-esclavo
  • Partitioning - Particionamiento de tablas

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

🐬 Introducción a MySQL

MySQL es un sistema de gestión de bases de datos relacional de código abierto, uno de los más populares del mundo para aplicaciones web.

Historia:

MySQL fue creado en 1995 por Michael Widenius y David Axmark. Su nombre proviene de la hija de Widenius, My. El símbolo del delfín se llama "Sakila".

Características Principales:

  • Open Source: Código abierto bajo licencia GPL
  • Multiplataforma: Windows, Linux, macOS
  • ACID: Transacciones seguras con InnoDB
  • Replicación: Maestro-esclavo y clustering
💡 ¿Sabías qué?

MySQL es usado por empresas como Facebook, Google, YouTube y Twitter para manejar grandes volúmenes de datos.

← Volver a temas

🔧 Instalación de MySQL

En Windows:

  1. Descarga MySQL Installer desde mysql.com
  2. Ejecuta el instalador
  3. Selecciona "MySQL Server" y "MySQL Workbench"
  4. Configura la contraseña de root

En Linux (Ubuntu/Debian):

sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation

En macOS:

brew install mysql
brew services start mysql

Verificar instalación:

mysql --version
mysql -u root -p
← Volver a temas

📦 Conceptos Básicos

Crear Base de Datos:

CREATE DATABASE IF NOT EXISTS mi_tienda;
USE mi_tienda;

Crear Tabla:

CREATE TABLE productos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

Tipos de Datos Comunes:

  • INT: Números enteros
  • VARCHAR(n): Cadenas de texto
  • DECIMAL(m,n): Números decimales
  • DATE/TIMESTAMP: Fechas
← Volver a temas

💻 Consultas SQL

SELECT Básico:

SELECT * FROM productos;
SELECT nombre, precio FROM productos WHERE stock > 0;
SELECT COUNT(*) FROM productos;

JOINs:

-- INNER JOIN
SELECT p.nombre, c.nombre AS categoria
FROM productos p
INNER JOIN categorias c ON p.categoria_id = c.id;

-- LEFT JOIN
SELECT p.nombre, c.nombre AS categoria
FROM productos p
LEFT JOIN categorias c ON p.categoria_id = c.id;

Agregaciones:

SELECT categoria_id, AVG(precio) as promedio
FROM productos
GROUP BY categoria_id
HAVING promedio > 100;
← Volver a temas

✅ Buenas Prácticas

Normalización:

  • 1FN: Valores atómicos, sin repetición
  • 2FN: Dependencia completa de la PK
  • 3FN: Sin dependencias transitivas

Índices:

-- Crear índice
CREATE INDEX idx_nombre ON productos(nombre);

-- Ver índices
SHOW INDEX FROM productos;

EXPLAIN:

EXPLAIN SELECT * FROM productos WHERE nombre = 'X';
← Volver a temas

🚀 Casos Reales

Replicación:

Configura un maestro para escrituras y esclavos para lecturas.

Backup Estratégico:

# Backup completo
mysqldump -u root -p mi_tienda > backup.sql

# Restaurar
mysql -u root -p mi_tienda < backup.sql

Connection Pooling:

Usa pools de conexión en tu aplicación para mejor rendimiento.

← Volver a temas

📋 Proyecto Final

Desarrolla una base de datos completa para e-commerce:

  1. Diseñar modelo entidad-relación
  2. Crear tablas normalizadas
  3. Implementar stored procedures
  4. Configurar índices estratégicos
  5. Crear vistas para reportes
  6. Implementar backup automático
💡 Proyecto sugerido:

Crea una base de datos para tienda online con usuarios, productos, pedidos y pagos.

← Volver a temas

💾 Backup, Restore y Replication

mysqldump:

# Backup de base de datos
mysqldump -u root -p mi_tienda > backup.sql

# Backup con compresión
mysqldump -u root -p mi_tienda | gzip > backup.sql.gz

# Backup de todas las bases
mysqldump -u root -p --all-databases > full_backup.sql

# Restore
mysql -u root -p mi_tienda < backup.sql

Replicación Maestro-Esclavo:

-- En el maestro (my.cnf)
log-bin=mysql-bin
server-id=1

-- Crear usuario de replicación
CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';

-- Ver estado del maestro
SHOW MASTER STATUS;

Configurar Esclavo:

-- En my.cnf del esclavo
server-id=2
relay-log=mysql-relay-bin

-- Configurar replicación
CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='replica',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=123;

START SLAVE;
SHOW SLAVE STATUS\G;
← Volver a temas

🔐 Transacciones y Control de Concurrencia

Transacciones:

START TRANSACTION;

UPDATE cuentas SET saldo = saldo - 500 WHERE id = 1;
UPDATE cuentas SET saldo = saldo + 500 WHERE id = 2;

-- Verificar
SELECT * FROM cuentas WHERE id IN (1, 2);

-- Confirmar o revertir
COMMIT;
-- o ROLLBACK;

Niveles de Aislamiento:

-- Ver nivel actual
SELECT @@tx_isolation;

-- Cambiar nivel
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- Niveles disponibles:
-- READ UNCOMMITTED
-- READ COMMITTED
-- REPEATABLE READ (default en InnoDB)
-- SERIALIZABLE

Locking:

-- Bloqueo de fila
SELECT * FROM productos WHERE id = 1 FOR UPDATE;

-- Bloqueo compartido
SELECT * FROM productos WHERE id = 1 LOCK IN SHARE MODE;

-- Bloqueo de tabla
LOCK TABLES productos WRITE;
← Volver a temas

📊 Subconsultas y UNION

Subconsultas Escalares:

-- Empleados con salario mayor al promedio
SELECT nombre, salario FROM empleados 
WHERE salario > (SELECT AVG(salario) FROM empleados);

Subconsultas de Tabla:

SELECT dept, promedio FROM (
    SELECT departamento_id AS dept, AVG(salario) AS promedio
    FROM empleados GROUP BY departamento_id
) AS stats WHERE promedio > 50000;

IN y EXISTS:

-- Clientes con pedidos
SELECT * FROM clientes 
WHERE id IN (SELECT cliente_id FROM pedidos);

-- Productos en categorías específicas
SELECT nombre FROM productos 
WHERE EXISTS (
    SELECT 1 FROM categorias WHERE id = productos.categoria_id AND nombre LIKE 'Elec%'
);

UNION:

-- Combinar resultados
SELECT nombre, 'Empleado' AS tipo FROM empleados
UNION
SELECT nombre, 'Cliente' AS tipo FROM clientes
ORDER BY nombre;
← Volver a temas

🧩 Stored Procedures, Functions y Triggers

Stored Procedure:

DELIMITER //
CREATE PROCEDURE sp_transferencias(
    IN origen INT, IN destino INT, IN monto DECIMAL(10,2)
)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SELECT 'Error' AS mensaje;
    END;
    
    START TRANSACTION;
    UPDATE cuentas SET saldo = saldo - monto WHERE id = origen;
    UPDATE cuentas SET saldo = saldo + monto WHERE id = destino;
    COMMIT;
    SELECT 'Transferencia exitosa' AS mensaje;
END //
DELIMITER ;

CALL sp_transferencias(1, 2, 100);

Function:

DELIMITER //
CREATE FUNCTION calcular_iva(precio DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    RETURN precio * 0.16;
END //
DELIMITER ;

SELECT nombre, precio, calcular_iva(precio) AS iva FROM productos;

Triggers:

CREATE TRIGGER tr_audit_update
AFTER UPDATE ON empleados
FOR EACH ROW
BEGIN
    INSERT INTO audit_log (tabla, accion, usuario, fecha)
    VALUES ('empleados', 'UPDATE', CURRENT_USER(), NOW());
END;
← Volver a temas

🚀 Optimización y Performance

EXPLAIN ANALYZE:

EXPLAIN ANALYZE
SELECT * FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
WHERE c.ciudad = 'Madrid';

Índices Compuestos:

-- Índice en columnas frecuentemente juntas
CREATE INDEX idx_fecha_estado ON pedidos(fecha_pedido, estado);

-- Índice parcial
CREATE INDEX idx_activos ON clientes(fecha_registro) 
WHERE activo = 1;

Query Cache (MySQL 5.7):

SHOW VARIABLES LIKE 'query_cache%';
SET GLOBAL query_cache_size = 67108864;

Particionamiento:

CREATE TABLE ventas (
    id INT, fecha DATE, monto DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(fecha)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p2025 VALUES LESS THAN MAXVALUE
);
← Volver a temas

Ejemplos de Código

Crear Base de Datos

CREATE DATABASE IF NOT EXISTS mi_tienda;
USE mi_tienda;

Crear Tabla

CREATE TABLE productos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) NOT NULL,
    stock INT DEFAULT 0,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

Consulta con JOIN

SELECT p.nombre, c.nombre AS categoria
FROM productos p
INNER JOIN categorias c ON p.categoria_id = c.id
WHERE p.stock > 0
ORDER BY p.precio DESC;

Stored Procedure

DELIMITER //
CREATE PROCEDURE ObtenerProductos()
BEGIN
    SELECT * FROM productos;
END //
DELIMITER ;

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/