Caçando N+1s e Eliminando Consultas Desperdiçadas no Laravel
O trabalho de performance costuma ser entediante.
Nem sempre se trata de histórias heroicas onde você reduz a latência em 80%. Na maioria dos dias, trata-se de limpeza. Você encontra consultas que nem sabia que estava executando. Então, você as deleta.
Se o seu app Laravel está crescendo, é provável que você tenha estes três problemas.
- Consultas N+1 Ocultas
Você não pode consertar o que não consegue ver. Use uma ferramenta como beyondcode/laravel-query-detector em seu ambiente local. Ela avisa quando você usa o padrão loop-and-lazy-load.
Não execute isso em produção. Isso adiciona overhead. Registre-o apenas quando seu app estiver em modo local ou de teste.
- Desperdício de Eager Loading
As pessoas costumam corrigir problemas de N+1 adicionando with(). Mas isso cria um novo problema. Você pode fazer o eager-load de um relacionamento que sua view não usa mais.
Se um redesign remover uma coluna de uma tabela, você deve remover a chamada with() correspondente no seu controller. Você está pagando por dados que descarta.
Trate cada eager load como uma solicitação. Se você não usa os dados, remova a solicitação.
- Recomputando os Mesmos Dados
Alguns valores permanecem os mesmos durante toda a requisição. Se você os calcula várias vezes, desperdiça CPU. Use memoization para corrigir isso.
Exemplo:
protected ?string $defaultConnection = null;
public function getDefaultConnectionName(): string
{
return $this->defaultConnection ??= $this->resolveDefaultConnection();
}
O operador ??= calcula o valor uma vez e o reutiliza pelo resto da requisição.
- Armadilhas de Consultas em Dashboards
Dashboards costumam executar uma consulta count() separada para cada card. Se você tem seis cards, executa seis consultas.
Em vez disso, faça estas duas coisas:
- Agrupe suas contagens. Obtenha todos os totais de uma tabela em uma única consulta.
- Use um cache de curta duração. As estatísticas do dashboard não precisam ser atualizadas ao segundo. Faça o cache delas por cinco minutos.
Um visitante paga o custo da consulta. Todos os outros recebem o resultado em cache.
Dica Final: Evite Regressões
Limpezas falham se os desenvolvedores adicionarem o código ruim novamente mais tarde. Use Pest para validar suas contagens de consultas. Defina um limite para quantas consultas uma página pode executar. Se um desenvolvedor adicionar um N+1, o teste falhará.
Otimização é, em grande parte, sobre remoção. Remova carregamentos não utilizados. Remova valores recomputados. Remova consultas desnecessárias.
