- Índices en MySQL
1.1 Concepto de Índice
Los índices en MySQL son estructursa que aceleran las consultas al organizar datos en columnas específicas. Sin índices, las búsquedas se vuelven lentas, similar a buscar una palabra en un libro sin un índice; con índices, el acceso es rápido y eficiente.
1.2 Tipos Comunes de Índices
MySQL almacena los índices de una tabla en archivos dedicados. Al modificar datos con operaciones INSERT, UPDATE o DELETE, los índices se actualizan automáticamente.
1.2.1 Índice de Clave Primaria (PRIMARY KEY)
Este índice es único y no permite valores nulos, identificando de manera exclusiva cada registro en una tabla. Una tabla puede tener solo una clave primaria.
Ejemplo de creación:
-- Crear base de datos
CREATE DATABASE db_ejemplo CHARACTER SET utf8mb4;
-- Crear tabla con clave primaria directamente
CREATE TABLE usuarios (
id_usuario INT PRIMARY KEY,
nombre VARCHAR(50),
email VARCHAR(100)
);
Alternativamente, se puede agregar después con:
ALTER TABLE usuarios ADD PRIMARY KEY (id_usuario);
1.2.2 Índice Único (UNIQUE)
Garantiza que todos los valores en la columna sean distintos, evitando duplicados. Es útil para campos como correos electrónicos o códigos de producto.
Sintaxis para crear:
-- Al definir la tabla
CREATE TABLE productos (
codigo_producto VARCHAR(20) UNIQUE,
descripcion TEXT
);
-- En una tabla existente
CREATE UNIQUE INDEX idx_codigo_unico ON productos(codigo_producto);
Prueba de unicidad:
INSERT INTO productos VALUES ('P001', 'Laptop');
-- Esto causaría error por duplicado:
INSERT INTO productos VALUES ('P001', 'Tablet');
1.2.3 Índice Ordinario (INDEX)
Mejora el rendimiento en consultas con WHERE u ORDER BY. Se recomienda crear en columnas frecuentemente filtradas.
Creación:
-- Usando CREATE INDEX
CREATE INDEX idx_nombre ON usuarios(nombre);
-- Modificando la tabla
ALTER TABLE usuarios ADD INDEX idx_email(email);
1.2.4 Eliminar Índices
Los índices consumen espacio; se deben borrar si ya no se usan para optimizar el rendimiento.
ALTER TABLE usuarios DROP INDEX idx_nombre;
1.3 Prueba de Rendimiento
Para demostrar el impacto, se puede usar una tabla con datos masivos. Sin índices, consultas complejas son lentas; al añadir índices, el tiempo se reduce significativamente.
Ejemplo con datos sintéticos:
-- Suponer una tabla 'registros' con millones de filas
SELECT * FROM registros WHERE ciudad = 'Madrid';
-- Añadir índice en 'ciudad' y repetir la consulta
ALTER TABLE registros ADD INDEX idx_ciudad(ciudad);
SELECT * FROM registros WHERE ciudad = 'Madrid';
1.4 Ventajas y Desventajas
Ventajas: Aceleran consultas, reducen tiempos de agrupamiento y ordenamiento.
Desventajas: Requieren espacio y mantenimiento adicional; las operaciones de escritura pueden volverse más lentas.
- Vistas en MySQL
2.1 Definición
Las vistas son tablas virtuales basadas en consultas SELECT. No almacenan datos físicamente, sino que muestran información de tablas subyacentes.
2.2 Utilidad
Simplifican consultas complejas y permiten control de acceso. Por ejemplo, crear una vista para exponer solo ciertas columnas a usuarios con permisos limitados.
2.3 Uso Práctico
Crear una vista:
-- Consulta base
SELECT p.nombre_producto, c.categoria
FROM productos p JOIN categorias c ON p.id_categoria = c.id;
-- Crear vista basada en la consulta
CREATE VIEW vista_productos_categorias AS
SELECT p.nombre_producto, c.categoria
FROM productos p JOIN categorias c ON p.id_categoria = c.id;
Consultar la vista:
SELECT * FROM vista_productos_categorias;
Ejemplo avanzado: Encontrar el producto más caro por categoría usando la vista.
SELECT categoria, nombre_producto, precio
FROM vista_productos_categorias
WHERE precio = (SELECT MAX(precio) FROM vista_productos_categorias WHERE categoria = 'Electrónica');
2.4 Diferencias con Tablas
Las vistas son de solo lectura generalmente; no modifican datos subyacentes. Eliminar una vista no afecta a las tablas originales.
- Procedimientos Almacenados en MySQL
3.1 Concepto
Son conjuntos de sentencias SQL guardados en la base de datos, ejecutables mediante llamadas. Permiten encapsular lógica compleja y reducir la interacción entre aplicaciones y la base de datos.
3.2 Pros y Contras
Ventajas: Mejoran el rendimiento al minimizar viajes de red; útiles para tareas repetitivas.
Desventajas: Pueden ser difíciles de mantener y depurar; menos flexibles en entornos dinámicos.
3.3 Métodos de Creación
3.3.1 Procedimiento Simple
Preparación de datos:
CREATE TABLE inventario (
id_item INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50),
cantidad INT
);
INSERT INTO inventario (nombre, cantidad) VALUES ('Widget', 100);
Crear procedimiento para listar items:
DELIMITER //
CREATE PROCEDURE listar_items()
BEGIN
SELECT * FROM inventario;
END //
DELIMITER ;
-- Ejecutar
CALL listar_items();
3.3.2 Con Parámetros de Entrada (IN)
Ejemplo para eliminar un item por ID:
DELIMITER //
CREATE PROCEDURE eliminar_item(IN item_id INT)
BEGIN
DELETE FROM inventario WHERE id_item = item_id;
END //
DELIMITER ;
-- Llamar con parámetro
CALL eliminar_item(1);
3.3.3 Con Parámetros de Salida (OUT)
Ejemplo que retorna el número de filas afectadas:
DELIMITER //
CREATE PROCEDURE insertar_item(IN nombre VARCHAR(50), IN cantidad INT, OUT resultado INT)
BEGIN
INSERT INTO inventario (nombre, cantidad) VALUES (nombre, cantidad);
SET resultado = ROW_COUNT(); -- Devuelve filas insertadas
END //
DELIMITER ;
-- Uso
CALL insertar_item('Gadget', 50, @resultado);
SELECT @resultado; -- Muestra 1 si fue exitoso
- Triggers en MySQL (Breve Introducción)
Los triggers se activan automáticamente ante eventos en una tabla (INSERT, UPDATE, DELETE). Por ejemplo, reducir el inventario al insertar una orden.
Creación básica:
DELIMITER //
CREATE TRIGGER actualizar_inventario
AFTER INSERT ON ordenes
FOR EACH ROW
BEGIN
UPDATE inventario SET cantidad = cantidad - 1
WHERE id_item = NEW.id_item;
END //
DELIMITER ;
- Lenguaje de Control de Datos (DCL)
5.1 Gestión de Usuarios
-- Crear usuario con acceso local
CREATE USER 'analista'@'localhost' IDENTIFIED BY 'clave_segura';
-- Crear usuario con acceso remoto
CREATE USER 'admin_remoto'@'%' IDENTIFIED BY 'otra_clave';
5.2 Concesión de Permisos
-- Otorgar permisos de lectura en una tabla específica
GRANT SELECT ON base_datos.tabla TO 'analista'@'localhost';
-- Otorgar todos los permisos
GRANT ALL PRIVILEGES ON *.* TO 'admin_remoto'@'%';
5.3 Revocar y Eliminar Usuarios
-- Revocar permisos
REVOKE SELECT ON base_datos.tabla FROM 'analista'@'localhost';
-- Eliminar usuario
DROP USER 'analista'@'localhost';
- Respaldo y Restauración de Bases de Datos
El respaldo es crucial para prevenir pérdidas de datos. Se puede hacer mediante herramientas gráficas o comandos.
Respaldo con línea de cmoandos:
mysqldump -u usuario -p base_datos > archivo_respaldo.sql
Restauración:
-- Primero crear la base de datos si no existe
CREATE DATABASE base_datos;
-- Luego restaurar
mysql -u usuario -p base_datos < archivo_respaldo.sql