El problema n+1 en PHP

Quizá no lo conozcas pero el problema n+1 puede ser algo serio. Este problema sucede, por ejemplo, cuando listamos productos. Normalmente buscamos primero los productos:

select * from productos;

y luego, para cada producto hacemos una consulta extra para recuperar sus datos. Imaginemos que tenemos 3 productos con los id 1, 2 y 3. Tendremos que hacer una consulta para cada uno de ellos:

select * from producto_detalles where id_producto = 1;
select * from producto_detalles where id_producto = 2;
select * from producto_detalles where id_producto = 1;

Aquí tenemos el problema n+1. En este caso n=3 (por ser tres productos) y para listar los productos harán falta 4 consultas (3+1); una para recuperar los id de los productos y luego una por cada producto.

¿Cómo lo solucionamos?

Hay varias posibilidades, y en la mayoría de frameworks ya lo tienen solucionado. Una posibilidad es cargar todos los datos de golpe:

select * from producto_detalles where id_producto in (1, 2, 3);

De esta forma tenemos una consulta para listar los id de los productos y otra para los detalles. Pasamos de tener n+1 consultas a tener solo dos.

Está claro que en este ejemplo con 3 productos es absurdo porque solo nos ahorramos una llamada.

¿Es un problema tan grave?

Si tenemos en cuenta que cada consulta a SQL requiere de bastante procesamiento ahorrar consultas es algo positivo. Pero, como siempre, tendremos que asegurarnos que la solución que usemos no es peor que el problema y conviene probar que realmente estamos consiguiendo una mejora con nuestra solución.


Tags: PHP


Y ahora descubre uno de los mejores libros de programación orientada a objetos en PHP.

Apúntate para conseguir capítulos de muestra, recibir el boletín y más información sobre los libros.