Optimización de Consultas SQL en MySQL: Técnicas para Mejorar el Rendimiento

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:

  1. Crear nueva página
  2. Mover 50% de registros (ej: 23, 47)
  3. Reorganizar punteros de páginas

Unión de Páginas (Page Merge)

Cuando las eliminaciones superan el 50% del umbral (MERGE_THRESHOLD):

  1. Marcar registros como eliminados
  2. Combinar páginas adyacentes semivacías
  3. Liberar páginas innecesarias

Principios de Diseño de Claves Primarias

  1. Minimizar longitud de clave primaria
  2. Usar inserción secuencial con AUTO_INCREMENT
  3. Evitar UUID o identificadores naturales (DNI)
  4. 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):

  1. COUNT(columna) (con comprobación NULL)
  2. COUNT(clave_primaria)
  3. 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';

Etiquetas: MySQL OptimizaciónSQL InnoDB Índices ConsultasEficientes

Publicado el 6-2 02:19