O que é o N+1?
Entenda o que é o problema do N+1
Vamos dizer que você tenha duas tabelas, categorias e artigos. Você quer listar todos os artigos de cada categoria, como você faria?
Sem recorrer a código poderíamos dizer que:
- Selecionaríamos as categorias; (1 Consulta)
- Para cada categoria, buscaríamos todos os seus artigos. (N Consultas)
Ou seja, 1 Consulta + N Consultas!
Por que chamam de N+1 se é 1+N?
Em resumo, convenção. Mas se você, como eu, não se contenta com uma resposta tão simples, existe uma possível explicação.
Foi convencionado que o N fosse colocado antes para dar foco no problema real, que são as N consultas desnecessárias.
Então tecnicamente é 1+N, mas convencionou-se chamar de N+1.

Por que isso é um problema?
O N+1 não é um problema per se, mas pode torna-se um problema em bases maiores afetando bastante a performance.

É importante também entender que quando falamos N não temos a real dimensão do problema, mas se definirmos N, percebemos que podem ser dezenas, centenas, milhares, milhões, bilhões... de requisições.
Então aquela pensa consulta que traz só os dados de produto seria executada N - centenas, milhares, milhões de - vezes.
Como se isso já não bastasse, teoricamente a cada uma das N consultas ele vai e volta do banco de dados, logo, além do tempo de cada uma das N consultas, somamos o tempo da latência de comunicação com o banco de dados.
Rapidamente as coisas passam a escalar ainda mais, então pra ficar mais fácil de visualizar, faremos um calculo simplificado.
Calculando
Temos a fórmula:
1 = Primeira Consulta
N = Consultas Subsequentes
T = Tempo da Consulta
L = Latencia
Tempo total = T1 + L1 + ((TN + LN) * N)

Usando a formula, vamos considerar os seguintes valores:
Tempo da primeira consulta: 50 ms
Latência da primeira consulta: 20 ms
Tempo de cada consulta N: 10 ms
Latência de cada consulta: 5 ms
Tempo total = T1 + L1 + ((TN + LN) * N)
Tempo total = 50ms + 20ms + ((10ms + 5ms) * N)
Tempo total = 70ms + (15ms * N)
- Para 10 registros → 220 ms
- Para 100 registros →1.570 ms
- Para 1.000 registros → 15.070 ms
Como é possível ver com apenas 1000 registros, que não é um numero difícil de atingir num banco de dados, já chegamos aos 15 segundos. Algo inaceitável nos tempos de hoje.
Mas os ORMs já não resolvem isso?
Sim e não, os ORMs tem várias maneiras de resolver isso implementadas, mas cabe ao desenvolvedor saber o momento e a maneira correta de utiliza-las.
Inclusive é muito comum que esse problema seja relacionado justamente ao uso de ORMs, que carregam os relacionamentos no objeto (dai Object Relational Model) por trás dos panos.
Se os relacionamentos não forem configurados corretamente, vão gerar diversos N+1.
Conclusão
Encerrarei este post por aqui para que não fique muito grande, mas o objetivo foi cumprido, entender o que é o N+1 e porque ele é um problema.
Em próximos posts vou entrar mais no detalhe de como percebe-lo e resolve-lo!
Fontes
SQLAlchemy - Relationship Loading Techniques
Planet Scale - What is the N+1 Query Problem and How to Solve it?