Inserción de Datos Eficiente
La inserción frecuente de datos mediante INSERT genera sobrecarga por conexiones repetidas. Técnicas de optimización:
Inserción por Lotes
INSERT INTO clientes VALUES
(101, 'Ana'),
(102, 'Carlos'),
(103, 'Diana');
Transacciones Manuales
START TRANSACTION;
INSERT INTO clientes VALUES (104, 'Elena'), (105, 'Fernando');
INSERT INTO clientes VALUES (106, 'Gloria'), (107, 'Héctor');
COMMIT;
Inserción Ordenada por Clave Primaria
- Inserción desordenada: 107 101 109 121 188 102
- Inserción ordenada: 101 102 103 104 105 107
Mecanismos de Almacenamiento
InnoDB organiza los datos en páginas mediante índices. Dos fenómenos clave:
División de Páginas (Page Split)
Al insertar datos en posiciones aleatorias, una página llena puede dividirse. Ejemplo: Inserción del valor 50 en páginas llenas [1-49] y [51-100] requiere:
- Crear nueva página
- Mover 50% de registros (ej: 23, 47)
- Reorganizar punteros de páginas
Unión de Páginas (Page Merge)
Cuando las eliminaciones superan el 50% del umbral (MERGE_THRESHOLD):
- Marcar registros como eliminados
- Combinar páginas adyacentes semivacías
- Liberar páginas innecesarias
Principios de Diseño de Claves Primarias
- Minimizar longitud de clave primaria
- Usar inserción secuencial con AUTO_INCREMENT
- Evitar UUID o identificadores naturales (DNI)
- No modificar claves primarias existentes
Carga Masiva con LOAD DATA
-- Habilitar carga local
SET GLOBAL local_infile = 1;
-- Importar archivo CSV
LOAD DATA LOCAL INFILE '/datos/usuarios.csv'
INTO TABLE usuarios
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n';
Optmiización de ORDER BY y GROUP BY
ORDER BY
Dos métodos de ejecución:
- Using filesort: Ordena en memoria intermedia (lento)
- Using index: Devuelve datos preordenados (óptimo)
-- Crear índice compuesto
CREATE INDEX idx_edad_tel ON empleados(edad ASC, telefono DESC);
-- Consulta optimizada
EXPLAIN SELECT id, edad, telefono
FROM empleados
ORDER BY edad ASC, telefono DESC;
Recomendaciones
- Aplicar principio de prefijo en índices compuestos
- Usar índices de cobertura
- Definir órdenes específicos (ASC/DESC) en índices
- Aumentar sort_buffer_size para operaciones grandes
GROUP BY
Utiliza mismos principios de indexación que ORDER BY. Requiere cumplimiento de prefijo en índices.
Optimización de LIMIT, COUNT y UPDATE
LIMIT
Problema común en paginación: LIMIT 2000000,10 requiere procesar 2 millones de registros. Solución:
SELECT t.*
FROM productos t
JOIN (
SELECT id
FROM productos
ORDER BY id
LIMIT 2000000, 10
) tmp ON t.id = tmp.id;
COUNT
Eficiencia comparativa (de menor a mayor):
COUNT(columna)(con comprobación NULL)COUNT(clave_primaria)COUNT(1)≈COUNT(*)(recomendado)
UPDATE
Actualizaciones deben usar índices para evitar bloqueos de tabla:
-- Usa bloqueo de fila (índice presente)
UPDATE alumnos SET codigo = 'A2024' WHERE id = 100;
-- Causa bloqueo de tabla (sin índice)
UPDATE alumnos SET codigo = 'B2024' WHERE nombre = 'Laura';