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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

Fonte: https://dev.to/nasrulhazim/a-day-of-performance-hardening-hunting-n1s-and-killing-wasted-queries-in-laravel-568p