Otimização de consultas ao banco de dados
Identifique consultas N+1, adicione índices e reduza a quantidade de consultas.
Otimização de consultas ao banco de dados é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
Identificando consultas lentas
Ative o registro de consultas lentas do MySQL e defina um limite. Analise as consultas que demoram mais que o esperado.
# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 # log queries over 500msEXPLAIN / EXPLAIN ANALYZE
Use EXPLAIN para entender como o MySQL executa uma consulta e verificar se os índices são utilizados.
-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)Adicionando índices
Os índices aceleram significativamente as leituras em colunas filtradas e ordenadas.
-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
// In Laravel migration:
$table->index(["user_id", "status"]);Problema de consulta N+1
O problema N+1 executa uma consulta para obter uma lista e mais uma consulta por item para um relacionamento. Corrija-o com carregamento antecipado.
<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;
// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;Selecionando apenas as colunas necessárias
Evite SELECT * — busque apenas as colunas necessárias para reduzir o uso de memória e a transferência pela rede.
<?php
// Bad:
$users = User::all();
// Good:
$users = User::select("id", "name", "email")->get();Dividindo grandes conjuntos de dados em blocos
Processe grandes conjuntos de resultados em blocos para evitar o esgotamento da memória.
<?php
User::chunk(500, function ($users) {
foreach ($users as $user) {
// process each user
}
});
// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));Cache de consultas
Armazene em cache agregações e relatórios dispendiosos que não mudam com frequência.
<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
return Order::whereMonth("created_at", now()->month)->sum("total");
});Evitando consultas em laços
Nunca execute consultas dentro de laços foreach. Colete os IDs primeiro e depois faça a busca em uma única consulta.
<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");
foreach ($cartItems as $item) {
$product = $products[$item["product_id"]];
}Agrupamento de conexões do banco de dados
O PHP-FPM cria uma nova conexão PDO por processo de trabalho. PgBouncer ou ProxySQL podem agrupar conexões para evitar sobrecarregar o banco de dados com o custo de criação de conexões.
Índices de cobertura
Um índice de cobertura inclui todas as colunas necessárias para atender a uma consulta — o MySQL pode respondê-la usando apenas o índice, sem acessar as linhas da tabela principal.
Resumo
Ative os registros de consultas lentas. Use EXPLAIN para encontrar índices ausentes. Carregue os relacionamentos antecipadamente. Selecione apenas as colunas necessárias. Divida grandes conjuntos de dados em blocos. Armazene agregações dispendiosas em cache. Evite consultas dentro de laços.
Verificação rápida
O que é o problema de consulta N+1?
Perguntas Frequentes
A aula “Otimização de consultas ao banco de dados” é grátis?
Sim — o texto completo de “Otimização de consultas ao banco de dados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Otimização de consultas ao banco de dados”?
Identifique consultas N+1, adicione índices e reduza a quantidade de consultas. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Otimização de consultas ao banco de dados”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Análise de desempenho do PHP com Xdebug
- OPcache: cache de bytecode
- Otimização de consultas ao banco de dados
- Gerenciamento de memória e dicas de desempenho