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.