Reescrevendo Consultas: Usando índices do jeito certo no MySQL.

No post anterior EXPLAIN bonito, índice inútil: A vida real no MySQL trouxe sobre como avaliar índices: quando fazem sentido, quando não ajudam e como identificar desperdícios.

Agora chegou a parte mais importante….. usar esses índices corretamente nas consultas.

Índice bom não salva query ruim.
E query ruim costuma ter sempre os mesmos vícios.

Neste post focaremos em:

  • Como o B‑Tree realmente funciona
  • Por que a ordem das colunas importa
  • Padrões de consulta que quebram o uso de índice
  • Como reescrever SQL para aproveitar índices existentes

Tudo com exemplos reais.

Como o MySQL usa um índice B‑Tree (na prática)

Índices no InnoDB são organizados como B‑Tree, o que significa:

  • Os dados são armazenados ordenados
  • A busca só é eficiente quando seguimos essa ordem
  • O MySQL não “pula” colunas dentro do índice
 
Considere este índice:
Lembrem-se a ordenação sempre será importante.

✅ Consultas que aproveitam bem esse índice:
 
No prompt:

 
 
 
❌ Consultas que não aproveitam o índice corretamente:
Sem a primeira coluna do índice, o MySQL não consegue navegar eficientemente no B‑Tree.
No prompt:
 
 
 
 

Regra de ouro: condição começa da esquerda

Esse conceito é conhecido como Leftmost Prefix Rule.

Um índice (A, B e C) pode ser usado como:

  • (A)
  • (A, B)
  • (A, B, C)
Mas não como:
  • (B)
  • (C)
  • (B, C)

Isto não é sobre a ordem do WHERE, e sim sobre quais colunas estão presentes.

Isso funciona:

Se existe índice (A, B) o otimizador rearranja internamente.
O problema não é a ordem do WHERE. É pular colunas do índice.

Funções e expressões: o maior sabotador de índices

Outro ponto mais comum é aplicar funções em coluna indexadas.

❌ Exemplo clássico:

Mesmo com índice em data_pedido, isso invalida o uso.

✅ Forma correta:

❌ Outro inimigo comum:
Mesma solução: transformar a lógica em intervalo, não em função.
No prompt:
 
 

LIKE, curingas e armadilhas silenciosas

Índices podem ser usados com LIKE, mas só se respeitarem o prefixo.

✅ Usa índice:


❌
Não usa índice (full scan):

Se o curinga vem antes, o B‑Tree não ajuda.

📌 Dica prática:

  • Para buscas desse tipo, pense em colunas derivadas, índices funcionais (MySQL 8+) ou estratégias de modelagem.

ORDER BY e LIMIT: ouro mal aproveitado

Um índice bem pensado pode eliminar filesort.

✅ Query eficiente:

Aqui o MySQL:

  • Usa o índice
  • Já lê ordenado
  • Para assim que encontra 10 linhas

 

❌ Query problemática seria:

Sem filtro em cliente_id, o índice não ajuda…. e voltamos para o full scan + filesort.
No prompt:
 
 


Temos diversos fatores que influenciam na má utilização de um indice, acima demonstrei alguns cenários mais óbvios. Porém, não podemos esquecer de sempre olharmos o DATATYPE de sua coluna.
Um exemplo comúm que enfrento em alguns sistemas MySQL é:

Assim o desenvolver ou aplicação estará forçando o MySQL converter, e ignorando o índice dependendo do contexto.
No prompt:

 

 

Conclusão

Índices não falham sozinhos, eles falham quando a consulta ignora como o B‑Tree funciona.
Reescrever SQL quase sempre traz mais ganho do que criar novos índices ou mexer em parâmetros.
Então não pense que “reescrever uma consulta é uma tuning avançado” é apenas:
  • Entender a ordem do índice.
  • Evitar funções desnecessárias.
  • Pensar em intervalos em vez de transformação de dados.
  • Saber quando o índice pode ajudar e quando não pode.

 

REFERÊNCIAS.
Indices Multiplos – MySQL Documentation.
Entendendo Indexação – Percona Documentation
Como usar Indices – MySQL Documentation

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