Quando o EXPLAIN mente para você… E por que um índice perfeito pode não resolver sua consulta!

Durante minha trajetória sempre utilizei o EXPLAIN como a principal ferramenta para analisar minhas operações SQL.
Quando uma Query apresentava certa lentidão, o processo era padrão para analisar:

Se o índice aparecia no plano de execução, a impressão era de que o problema estava resolvido.

Mas ao longo do tempo, comecei a perceber alguns fatores curiosos:

  1. Consultas mesmo indexadas, continuava lenta.
  2. Alguns indices eram ignorados pelo otimizador.
  3. O número de linhas retornado no Explain, nem sempre era a realizada daquela tabela.

Foi ai que passei a perceber que:

“O explain não mostra a realidade. O Explain mostra o que o otmizador acredita ser a realidade”.

Neste post vamos utilizar uma tabela “Clientes” para demonstrar situações onde o EXPLAIN pode induzir conclusões equivocadas e como validar o comportamento real
da consulta.

 

Cenário 1 -> Indice existe, mas o MySQL não quer usá-lo.

Imagine a seguinte operação:

Vemos um resultado tranquilo.

Agora, como uma pequena alteração:

Resultado:

Full table Scan.

 

Nossa Henrique, mas o que aconteceu?

O índice continua existindo.
Mas o problema é que o MySQL precisará executar:

para cada linha antes de comparar o valor, tendo como consequência
a não utilização do índice.

 

Primeira lição!
“O índice não desapareceu.
Nós criamos uma consulta que impede sua utilização!!!”

 


Cenário 2 -> O índice está sendo usado e mesmo assim a
consulta continua ruim?

Imagine agora, a seguinte distribuição:

Então, executamos:

E podemos observar acima:

Parece ótimo, usando nossa operação utiliza do indice.

Mas existe um detalhe compartilhado no início:
“95% dos registros possuem o valor SAO PAULO”.

Sendo assim, o indice precisará acessar a tabela inteira.

 

Segunda lição!

“Índice utilizado não significa consulta rápida.”

 


Cenário 3 -> O Explain e a realidade podem ser diferentes!

Vamos analisar agora:

Resultado obtido:

Até aqui, vemos o uso do indice.
O otimizador estima que aproximadamente 48583 registros serão retornados.

Então, vamos validar esta informação:

Eita…. agora temos uma situação interessante!

Informação Valor
Estimativa do EXPLAIN                      48.583
Registros reais                      99.000

Uma diferença superior a 100%.

 

Então, o Explain esta mentindo?

Não exatamente, e esta é uma das maiores armadilhas para quem analisa performance apenas utilizando o EXPLAIN.

O Explain não executa a consulta, ele apenas utiliza informações estatísticas armazenadas pelo mecanismo para estimar:

  • Cardinalidade.
  • Seletividade.
  • Custo de acesso.
  • Quantidade de linhas.

Em outras palavras:

“O explain mostra o que o otimizador acredita que vai acontecer.”

Então Henrique, como descobrir a realidade?

No MySQL 8 em diante, temos a ferramenta extremamente útil:

Diferentemente do Explain tradicional, o comando realmente executa a consulta e traz informações como:

  • Tempo real de execução.
  • Linhas processadas.
  • Loops.
  • Operadores executados.

Agora, vamos observar na prática:

 

Terceira lição!

“O Explain mostra uma previsão, o Explain Analyze mostra a realidade”.

 


Cenário 4 -> Descobrindo o raciocínio do otimizador.

Uma funcionalidade pouco utilizada, mas extremamente poderosa é o:

Na prática, habilitando a funcionalidade:

Em seguinda, executamos a operação:

Acima, apenas um resumo inicial do que você irá encontrar.
Como:

  • Planos considerados.
  • Custos calculados.
  • Índices avaliados.
  • Índices descartados.
  • Plano escolhido.

É literalmente o processo de tomada de decisão do otimizador.

 

Quarta lição!

“Nem sempre o MySQL escolhe o plano que nós gostaríamos.
Mas quase sempre existe um motivo para a escolha.”

 


Conclusão.

Depois de analisar alguns cenários, deixo abaixo 3 pontos importantes:

  1. O Explain é uma ferramenta ESSENCIAL.
  2. O Explain não está mentindo!
  3. Mas ele também não está contando toda a história.

O otimizador trabalha com estimativas, e estas estimativas podem ser influenciadas por:

  • Cardinalidade.
  • Seletividade.
  • Distribuição de dados.
  • Estatísticas desatualizadas.
  • Funções aplicadas sobre colunas.

Por isto, sempre que possível complemente sua análise utilizando:

E também:

Porque existe uma grande diferença entre:

“O que o MySQL acredita que vai acontecer e…..
O que realmente acontece!”

 

Referências:

MySQL 8.4 -> Explain Statement.

MySQL 8.4 -> Explain Analyze.

MySQL 8.4 -> Optimizer Trace

 

COMPARTILHE:
Picture of Henrique Borba Garcia

Henrique Borba Garcia

Iniciei meus estudos na área de Desenvolvimento no ano de 2021. Atualmente, em MySQL tenho uma experiência de 5 anos, e com bancos não relacionais (MongoDB) 2 anos. Desempenho o papel de LÍDER TÉCNICO para ambas as técnologias. Sou bastante persistente e proativo em diversos assuntos em banco de dados. Minhas certificações. . MySQL 2025 Solution Enginner Specialist Assessment. . MySQL Database Administrator 8.0 . MySQL Database Developer 8.0 . OCI Foundations 2021, 2022, 2023, e 2024. . MySQL Database Service . MySQL Explorer. . SQL Explorer. . Oracle Cloud Data Management 2023
Picture of Henrique Borba Garcia

Henrique Borba Garcia

Iniciei meus estudos na área de Desenvolvimento no ano de 2021. Atualmente, em MySQL tenho uma experiência de 5 anos, e com bancos não relacionais (MongoDB) 2 anos. Desempenho o papel de LÍDER TÉCNICO para ambas as técnologias. Sou bastante persistente e proativo em diversos assuntos em banco de dados. Minhas certificações. . MySQL 2025 Solution Enginner Specialist Assessment. . MySQL Database Administrator 8.0 . MySQL Database Developer 8.0 . OCI Foundations 2021, 2022, 2023, e 2024. . MySQL Database Service . MySQL Explorer. . SQL Explorer. . Oracle Cloud Data Management 2023

PARTICIPE

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

POSTADO POR
Picture of Henrique Borba Garcia

Henrique Borba Garcia

Iniciei meus estudos na área de Desenvolvimento no ano de 2021. Atualmente, em MySQL tenho uma experiência de 5 anos, e com bancos não relacionais (MongoDB) 2 anos. Desempenho o papel de LÍDER TÉCNICO para ambas as técnologias. Sou bastante persistente e proativo em diversos assuntos em banco de dados. Minhas certificações. . MySQL 2025 Solution Enginner Specialist Assessment. . MySQL Database Administrator 8.0 . MySQL Database Developer 8.0 . OCI Foundations 2021, 2022, 2023, e 2024. . MySQL Database Service . MySQL Explorer. . SQL Explorer. . Oracle Cloud Data Management 2023
PARCEIROS