- 1 1. O que é o EXPLAIN do MySQL? Por que você deve usá-lo?
- 2 2. Entendendo as colunas de saída do EXPLAIN (com imagem ilustrada)
- 3 3. Aprenda por Exemplo: Como Usar EXPLAIN e Interpretar Resultados
- 4 4. Técnicas Práticas de Otimização de Consultas Baseadas nos Resultados do EXPLAIN
- 5 5. Análise Visual com MySQL Workbench Visual EXPLAIN
- 6 6. Perguntas Frequentes (FAQ)
- 7 7. Resumo: Use EXPLAIN para Descobrir Oportunidades de Otimização SQL
- 7.1 ✅ O Papel e Uso Básico do EXPLAIN
- 7.2 ✅ Como Ler as Colunas de Saída e Avaliar o Desempenho
- 7.3 ✅ Diagnóstico Prático e Otimização Através de Exemplos Reais
- 7.4 ✅ Use Ferramentas GUI para Confirmação Visual
- 7.5 ✅ Cobertura de FAQ para Cenários do Mundo Real
- 7.6 ✍️ Faça do EXPLAIN um Hábito para Melhorar suas Habilidades SQL
1. O que é o EXPLAIN do MySQL? Por que você deve usá-lo?
O que é EXPLAIN? Um comando para visualizar planos de execução
No MySQL, EXPLAIN é um comando usado para visualizar como uma consulta SQL é executada. Ele é especialmente útil para entender como os dados são recuperados em instruções SELECT, e exibe o plano de execução da consulta.
Por exemplo, ao executar uma consulta como SELECT * FROM users WHERE age > 30, EXPLAIN permite que você veja detalhes internos, como qual índice o MySQL está usando e em que ordem as tabelas são percorridas.
O uso é simples — basta adicionar EXPLAIN no início da sua consulta.
EXPLAIN SELECT * FROM users WHERE age > 30;
Quando escrito desta forma, várias colunas descrevendo o plano de execução da consulta serão exibidas. Cada item será explicado em detalhes nas seções seguintes.
Por que você deve usá-lo: Tornar as causas de consultas lentas visíveis
Um erro comum que muitos desenvolvedores cometem é assumir que “se o SQL funciona, não há problema”. No entanto, a execução lenta de consultas pode impactar negativamente o desempenho geral da aplicação.
Em sistemas que lidam com grandes volumes de dados, até mesmo uma única consulta ineficiente pode se tornar um gargalo e sobrecarregar significativamente o servidor.
É aí que o EXPLAIN se torna extremamente útil. Ao revisar o plano de execução, você pode ver claramente se está sendo realizado um escaneamento completo da tabela ou se os índices estão sendo utilizados corretamente.
Em outras palavras, usar o EXPLAIN permite que você identifique gargalos de desempenho e determine como otimizá-los. A eficácia dos índices, em particular, torna-se muito mais clara ao analisar a saída do EXPLAIN.
Instruções SQL suportadas pelo EXPLAIN (SELECT, UPDATE, etc.)
O EXPLAIN funciona não apenas com instruções SELECT, mas também com as seguintes instruções SQL:
- SELECT
- DELETE
- INSERT
- REPLACE
- UPDATE
Por exemplo, ao executar uma instrução DELETE em um grande conjunto de dados, se os índices não forem usados corretamente, o MySQL pode realizar um escaneamento completo da tabela, aumentando significativamente o tempo de execução. Para prevenir tais problemas, é altamente eficaz verificar o plano de execução com EXPLAIN antes de executar instruções DELETE ou UPDATE.
Dependendo da sua versão do MySQL, você também pode usar EXPLAIN ANALYZE, que fornece informações de execução ainda mais detalhadas. Isso será abordado mais adiante no artigo.
2. Entendendo as colunas de saída do EXPLAIN (com imagem ilustrada)
Lista e explicação das colunas básicas de saída
A saída do EXPLAIN inclui as seguintes colunas (levemente diferentes dependendo da versão do MySQL):
| Column Name | Description |
|---|---|
| id | Identifier indicating execution order or grouping within the query |
| select_type | The type of SELECT (e.g., subquery, UNION) |
| table | Name of the table being accessed |
| type | Join type (access method) |
| possible_keys | Possible indexes that could be used |
| key | Actual index used |
| key_len | Length of the used index (in bytes) |
| ref | Value compared against the index |
| rows | Estimated number of rows MySQL expects to scan |
| Extra | Additional details (sorting, temporary tables, etc.) |
Entre elas, as quatro colunas mais importantes para ajuste de desempenho são type / key / rows / Extra.
Como ler as quatro colunas chave: type / key / rows / Extra
1. type (Método de Acesso)
Esta coluna indica como o MySQL acessa a tabela. Ela afeta diretamente o desempenho.
| Example Value | Meaning | Performance Level |
|---|---|---|
| ALL | Full table scan | ✕ Slow |
| index | Full index scan | △ Moderate |
| range | Range scan | ○ Good |
| ref / eq_ref | Index lookup | ◎ Excellent |
| const / system | Single-row access | ◎ Very Fast |
Se type = ALL, isso significa que nenhum índice está sendo usado e todas as linhas são percorridas — o método de acesso mais lento. Idealmente, você deve otimizar as consultas para ref ou const.
2. key (Índice usado)
Esta coluna exibe o nome do índice realmente usado.
Se nada for exibido, a consulta provavelmente não está usando um índice.
3. rows (Linhas estimadas a percorrer)
Isso mostra quantas linhas o MySQL estima que percorrerá. Quanto maior o número, mais tempo de execução tende a ser. O objetivo é otimizar sua consulta para que rows fique o mais próximo possível de 1.
4. Extra (Informações adicionais)
A coluna Extra inclui detalhes adicionais, como operações de ordenação ou uso de tabelas temporárias.
| Extra Example | Meaning | Optimization Hint |
|---|---|---|
| Using temporary | Temporary table used (performance degradation) | Review GROUP BY / ORDER BY |
| Using filesort | Manual sorting operation performed | Add index-based sorting |
| Using index | Data retrieved using only the index (fast) | ○ Good state |
Se você vir Using temporary ou Using filesort, deve revisar sua instrução SQL ou o design do índice.
[Illustration] Exemplo de saída do EXPLAIN
EXPLAIN SELECT * FROM users WHERE age > 30;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | age_index | NULL | NULL | NULL | 5000 | Using where |
Neste exemplo, embora o índice (age_index) exista, ele não é realmente usado, resultando em ALL (escaneamento completo da tabela). Isso indica espaço para otimização.

3. Aprenda por Exemplo: Como Usar EXPLAIN e Interpretar Resultados
Exemplo 1: Saída do EXPLAIN para uma Consulta SELECT Simples (Com Explicação)
Vamos começar com uma consulta SELECT simples em uma única tabela.
EXPLAIN SELECT * FROM users WHERE age > 30;
Suponha que a saída do EXPLAIN seja assim:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | age | NULL | NULL | NULL | 5000 | Using where |
Explicação:
type: ALL→ Varredura completa da tabela. Nenhum índice está sendo usado.key: NULL→ Nenhum índice está realmente sendo usado.rows: 5000→ O MySQL estima que escaneará cerca de 5.000 linhas.
Como melhorar:
Ao adicionar um índice à coluna age, você pode melhorar significativamente o desempenho da consulta.
CREATE INDEX idx_age ON users(age);
Se você executar o EXPLAIN novamente, deverá ver o type mudar para range ou ref, confirmando que o índice agora está sendo usado.
Exemplo 2: Analisar a Saída do EXPLAIN para uma Consulta com JOIN
Em seguida, vamos analisar um exemplo que faz JOIN de várias tabelas.
EXPLAIN
SELECT orders.id, users.name
FROM orders
JOIN users ON orders.user_id = users.id
WHERE users.age > 30;
Saída de exemplo:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | users | ALL | PRIMARY, age | NULL | NULL | NULL | 3000 | Using where |
| 1 | SIMPLE | orders | ref | user_id | user_id | 4 | users.id | 5 | Using index |
Explicação:
- A tabela
usersestá fazendo uma varredura completa (ALL), portanto esta é a parte a ser melhorada. - Enquanto isso, a tabela
ordersusa um índice comref, o que é eficiente.
Pontos de otimização:
- Adicionar um índice em
users.agepode acelerar a varredura da tabelausers. - O segredo é projetar índices de modo que a cláusula WHERE possa filtrar linhas antes do JOIN.
Quando os Índices Não São Usados (Exemplo Ruim → Exemplo Bom)
Exemplo ruim: cláusula WHERE usando uma função
SELECT * FROM users WHERE DATE(created_at) = '2024-01-01';
Com uma consulta como esta, o índice se torna inutilizável porque a função DATE() transforma o valor da coluna, impedindo que o MySQL use o índice de forma eficiente.
Exemplo melhorado: especificar um intervalo sem usar uma função
SELECT * FROM users
WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';
Isso habilita o índice na coluna created_at, permitindo que o MySQL recupere os dados de forma eficiente.
Conclusão: Use Exemplos Reais de EXPLAIN para Diagnosticar o Desempenho
Ao analisar a saída do EXPLAIN em consultas reais, você pode identificar claramente onde estão os gargalos e como otimizá-los.
ALL→ Varredura completa. Considere adicionar ou ajustar índices.key = NULL→ Índice não usado. Necessita investigação.ExtracontémUsing temporary→ Aviso de desempenho.- Usar funções ou cálculos nas condições pode desativar o uso de índices.
Manter esses pontos em mente ajudará você a melhorar continuamente o desempenho das consultas com o EXPLAIN.
4. Técnicas Práticas de Otimização de Consultas Baseadas nos Resultados do EXPLAIN
Noções Básicas de Design de Índices para Evitar “type: ALL”
Se o EXPLAIN mostrar type: ALL, isso significa que o MySQL está realizando uma varredura completa da tabela. Esta é uma operação muito custosa e se torna um gargalo importante para tabelas que contêm milhares a milhões de linhas.
Como evitá-lo:
- Adicionar índices às colunas usadas na cláusula WHERE
CREATE INDEX idx_age ON users(age);
- Se você tem múltiplas condições, considere um índice composto
CREATE INDEX idx_status_created ON orders(status, created_at);
- Evite padrões LIKE que não começam com um prefixo
-- Bad example (index won’t work) WHERE name LIKE '%tanaka%' -- Good example (index may work) WHERE name LIKE 'tanaka%'
O que Significa “Extra: Using temporary” e Como Corrigir
Se a coluna Extra mostrar “Using temporary”, isso significa que o MySQL está criando uma tabela temporária internamente para processar a consulta. Isso costuma acontecer quando operações como GROUP BY ou ORDER BY não podem ser tratadas apenas por índices, obrigando o MySQL a usar armazenamento temporário para organizar os dados manualmente.
Como corrigi-lo:
- Aplicar índices às colunas usadas em GROUP BY e ORDER BY
CREATE INDEX idx_group_col ON sales(department_id);
- Remova ordenação ou GROUP BY desnecessários do seu SQL
- Use LIMIT ou subconsultas para reduzir os dados-alvo
Entenda o que “rows” e “key” dizem para melhorar o desempenho
A coluna rows indica quantas linhas o MySQL prevê que precisará ler da tabela. Por exemplo, uma consulta que mostra rows = 100000 pode impactar significativamente o desempenho.
Quando esse valor é grande, provavelmente você precisa aplicar índices que reduzam o número de linhas escaneadas ou reescrever suas condições.
Por outro lado, a coluna key mostra o índice realmente usado. Se for NULL, isso é um aviso de que nenhum índice está sendo usado.
Lista de verificação de otimização:
- Se
rowsfor grande → Seus filtros são eficazes? Os índices estão sendo usados corretamente? - Se
key = NULL→ Você está usando padrões em WHERE/JOIN que impedem o uso de índices?
Transforme EXPLAIN e Otimização em um Hábito
Para ajustar consultas de forma eficaz, a abordagem básica é repetir este ciclo: escrever → verificar com EXPLAIN → melhorar → verificar novamente.
Mantenha este fluxo de trabalho em mente:
- Escreva a consulta normalmente
- Verifique o plano de execução com
EXPLAIN - Revise
type,key,rowseExtra - Se houver um gargalo, revise os índices ou reescreva a consulta
- Execute
EXPLAINnovamente para confirmar as melhorias
O desempenho da consulta é influenciado não apenas pelos índices, mas também por como a própria consulta é escrita. Comparações simples (em vez de funções) e condições diretas podem ser surpreendentemente eficazes.
5. Análise Visual com MySQL Workbench Visual EXPLAIN
Verifique Planos de Execução Visualmente com uma Ferramenta GUI
MySQL Workbench é uma ferramenta GUI especializada em administração e desenvolvimento MySQL. Uma de suas maiores vantagens é que ela pode exibir visualmente planos de execução, que frequentemente são difíceis de ler na saída do terminal.
Com o Visual EXPLAIN, você pode revisar as seguintes informações em uma estrutura de árvore:
- Ordem de acesso de cada tabela
- Tipo de JOIN usado
- Status de uso de índices
- Se está ocorrendo uma varredura completa da tabela
- Operações de filtragem e ordenação de dados
Como o plano é exibido graficamente, até mesmo iniciantes podem identificar mais facilmente onde existem gargalos de desempenho.
[With Images] Como Usar e Ler o Visual EXPLAIN (Passo a Passo)
Siga estes passos para usar o Visual EXPLAIN:
- Inicie o MySQL Workbench e abra sua conexão de banco de dados → Certifique‑se de que a conexão esteja configurada previamente.
- Digite sua consulta alvo no editor SQL
SELECT * FROM users WHERE age > 30;
- Clique no ícone “EXPLAIN VISUAL” ao lado do botão EXPLAIN → Ou clique com o botão direito e selecione “Visual Explain” no menu.
- O plano de execução será exibido visualmente Quando você clicar em cada nó (tabela), informações detalhadas como as seguintes aparecerão:
- Método de acesso (ALL, ref, range, etc.)
- Índice usado
- Linhas estimadas (rows)
- Condições de filtro e método de JOIN
Nota:
No Visual EXPLAIN, as cores e ícones dos nós ajudam a destacar operações pesadas ou partes ineficientes.
Preste atenção especial aos nós destacados em vermelho, pois eles normalmente indicam preocupações de desempenho.
Até Iniciantes Podem Encontrar Facilidade em Identificar Gargalos
A saída baseada em texto do EXPLAIN pode parecer esmagadora no início, mas o Visual EXPLAIN faz com que as áreas problemáticas se destaquem visualmente.
Por exemplo, torna‑se mais fácil identificar:
- Tabelas usando
type: ALL - Blocos de consulta mostrando
Using temporary - Padrões com JOINs desnecessários
- Tabelas onde índices não estão sendo usados
Com sua interface GUI, você pode formar rapidamente hipóteses de otimização, e também é útil para compartilhar e revisar o desempenho SQL dentro de uma equipe.
O Visual EXPLAIN é especialmente valioso para usuários de SQL iniciantes a intermediários.
Se você não tem certeza de como interpretar os resultados do EXPLAIN, experimente usar este recurso.
6. Perguntas Frequentes (FAQ)
Q1. Quando devo usar o EXPLAIN?
A. Você deve usar EXPLAIN sempre que sentir insegurança sobre a velocidade de execução de uma consulta — especialmente se a consulta “parece lenta”. Também é útil quando você quer verificar se uma consulta recém‑criada está usando índices corretamente.
Ao verificar o plano de execução antes da implantação, você pode identificar riscos de desempenho cedo.
Q2. A saída mostra type = ALL. O que devo fazer?
A. type: ALL significa que o MySQL está realizando uma varredura completa da tabela. Essa é uma operação de alto custo e pode degradar significativamente o desempenho, especialmente em tabelas grandes.
Considere as seguintes ações:
- Adicionar índices às colunas usadas na cláusula WHERE
- Evitar funções ou operações que desativem o uso de índices
- Evitar
SELECT *e recuperar apenas as colunas necessárias
Q3. “Using temporary” na coluna Extra é um problema?
A. Using temporary indica que o MySQL está criando internamente uma tabela temporária para processar a consulta. Isso costuma ocorrer com GROUP BY ou ORDER BY, e pode aumentar os custos de memória e I/O de disco.
Possíveis soluções incluem:
- Adicionar índices às colunas usadas em GROUP BY / ORDER BY
- Reduzir ordenações ou agregações desnecessárias
- Usar LIMIT ou subconsultas para reduzir o conjunto de dados
Q4. Como usar o Visual EXPLAIN?
A. Você pode usar a ferramenta oficial do MySQL “MySQL Workbench” para visualizar os resultados do EXPLAIN facilmente em uma interface gráfica. Basta inserir sua consulta e clicar no botão “Visual Explain”.
Isso é particularmente recomendado para:
- Usuários que acham a saída do EXPLAIN baseada em texto difícil de ler
- Aqueles que desejam entender visualmente JOINs complexos
- Equipes que revisam o desempenho de SQL juntas
Q5. Por que meu índice não está sendo usado mesmo existindo?
A. Mesmo que um índice exista, o MySQL nem sempre o utiliza. Índices podem ser ignorados em casos como:
- Usar funções ou expressões na cláusula WHERE (ex.:
WHERE YEAR(created_at) = 2024) - Baixa cardinalidade (distribuição de valores baixa), onde uma varredura completa é considerada mais rápida
- A ordem das colunas não corresponde à definição de um índice composto
Para confirmar se um índice está sendo usado corretamente, sempre verifique a coluna key no EXPLAIN.
7. Resumo: Use EXPLAIN para Descobrir Oportunidades de Otimização SQL
Ajustar desempenho no MySQL não é apenas sobre adicionar índices.
A ferramenta essencial para identificar quais consultas são gargalos, por que são lentas e como corrigi‑las é o EXPLAIN.
Neste artigo, cobrimos os seguintes pontos principais:
✅ O Papel e Uso Básico do EXPLAIN
- Basta adicionar
EXPLAINantes de uma consulta para verificar seu plano de execução - Problemas como varreduras completas (ALL) e Using temporary tornam‑se visíveis
✅ Como Ler as Colunas de Saída e Avaliar o Desempenho
- As quatro colunas mais importantes são
type,key,rowseExtra - Evite varreduras completas de tabelas e busque a utilização adequada de índices
- Tenha cautela ao ver Using temporary ou Using filesort
✅ Diagnóstico Prático e Otimização Através de Exemplos Reais
- Não basta apenas adicionar índices, melhorar a sintaxe SQL também importa
- Mesmo consultas complexas com JOINs ou subconsultas podem ser analisadas usando EXPLAIN
- Refinar continuamente as consultas com base nos planos de execução é a forma mais rápida de melhorar o desempenho
✅ Use Ferramentas GUI para Confirmação Visual
- Use “Visual EXPLAIN” no MySQL Workbench para visualizar planos de execução graficamente
- Mais fácil para iniciantes identificar gargalos visualmente
- Útil para discussões em equipe e revisões de desempenho de SQL
✅ Cobertura de FAQ para Cenários do Mundo Real
- Explicados causas e soluções para problemas como type=ALL e key=NULL
- Fornecidos exemplos de por que índices podem não ser usados
✍️ Faça do EXPLAIN um Hábito para Melhorar suas Habilidades SQL
Se você criar o hábito de verificar consultas com EXPLAIN toda vez que escrever SQL, naturalmente começará a escrever consultas mais rápidas e eficientes.
Isso não é apenas um truque técnico — é parte do desenvolvimento de alfabetização profissional em SQL.
- Execute EXPLAIN imediatamente após escrever uma consulta
- Corrija planos de execução suspeitos imediatamente
- Projete índices eficientes de forma cuidadosa
Ao dominar esse ciclo, suas habilidades em MySQL melhorarão gradualmente.
Esperamos que este artigo se torne seu primeiro passo rumo a uma melhor otimização de consultas.
Se você tem dúvidas ou gostaria que fossem abordados tópicos adicionais, sinta‑se à vontade para deixar um comentário!


