Tienes una web funcionando, los usuarios entran, pero algo no va bien: la página tarda más de 3 segundos en cargar. Google lo penaliza, los visitantes se van y las ventas caen. ¿Te suena? El problema casi siempre está en el código PHP o en cómo se habla con la base de datos MySQL.

En esta guía te explico las causas más frecuentes de lentitud en webs PHP y qué hacer exactamente para solucionarlas.

1. Consultas MySQL que matan el rendimiento

El error más habitual es ejecutar consultas dentro de bucles. Imagina que tienes una lista de 50 pedidos y para cada pedido lanzas una consulta a la base de datos para obtener el nombre del cliente. Eso son 50 consultas donde debería haber 1.

La solución es usar JOINs o cargar todos los datos de golpe con una sola consulta:

-- ❌ Malo: consulta dentro de un bucle (N+1 problem)
SELECT * FROM pedidos;
-- ...luego en PHP, para cada pedido:
SELECT nombre FROM clientes WHERE id = ?;

-- ✅ Bueno: una sola consulta con JOIN
SELECT p.id, p.total, c.nombre
FROM pedidos p
JOIN clientes c ON c.id = p.cliente_id;

Otra causa frecuente: hacer SELECT * cuando solo necesitas 2 o 3 campos. Cuantos menos datos mueves entre el servidor MySQL y PHP, más rápido va todo.

2. Falta de índices en las columnas que filtras

Si filtras por un campo (en el WHERE, en el JOIN o en el ORDER BY) y ese campo no tiene índice, MySQL recorre cada fila de la tabla. En tablas pequeñas no se nota; en tablas con 100.000 registros, la página puede tardar segundos.

-- Añadir índice a la columna que más filtras
ALTER TABLE pedidos ADD INDEX idx_cliente_id (cliente_id);

-- Verificar que MySQL usa el índice con EXPLAIN
EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 5;

Usa EXPLAIN delante de tus consultas lentas para ver si MySQL está haciendo un «full table scan» (malo) o usando un índice (bueno).

3. PHP sin caché: repitiendo trabajo innecesario

Cada vez que un usuario carga tu página, PHP ejecuta el mismo código, hace las mismas consultas y genera el mismo HTML. Si ese contenido no cambia cada minuto, estás desperdiciando recursos.

La solución más sencilla es implementar caché de consultas con variables de sesión o con archivos. Para proyectos más serios, Redis o Memcached marcan la diferencia:

// Caché simple en PHP con archivos
function obtenerDatos($clave, $ttl = 3600) 

Con esto, la primera carga consulta MySQL; las siguientes durante 1 hora leen del disco, que es mucho más rápido.

4. Imágenes sin optimizar y assets sin comprimir

Un error que no es de PHP ni de MySQL pero que ralentiza igual: subir imágenes directamente de la cámara (5-10 MB) sin redimensionar. La solución es comprimir antes de subir y servir formatos modernos como WebP.

En PHP puedes hacerlo automáticamente al subir:

// Convertir imagen a WebP al subir con PHP
$imagen = imagecreatefromjpeg($_FILES['foto']['tmp_name']);
imagewebp($imagen, 'uploads/foto.webp', 80); // calidad 80
imagedestroy($imagen);

5. Mide primero, optimiza después

Antes de tocar nada, mide. Herramientas gratuitas que uso:

  • Google PageSpeed Insights — te dice exactamente qué falla
  • Query Monitor (si usas WordPress) — muestra todas las consultas SQL
  • EXPLAIN en MySQL — analiza el plan de ejecución de tus consultas
  • Xdebug / Blackfire — para hacer profiling de PHP en profundidad

La mayoría tienen el mismo problema

La mayoría de webs PHP lentas tienen el mismo problema: consultas MySQL ineficientes, falta de índices y ausencia de caché. Aplicando estos tres puntos puedes reducir el tiempo de carga a la mitad o más sin cambiar de servidor ni de tecnología.

Si tienes una web que va lenta y no sabes por dónde empezar, escríbeme y le echo un vistazo. A veces una auditoría rápida revela problemas sencillos que marcan una diferencia enorme.