← Voltar para os artigos

Por que sua query ignora o índice (e a função na coluna é a culpada)

Por Fernando Nagao Douverny · 30 de julho de 2026 · 2 min de leitura

intermediárioarmadilhas

Existe índice na coluna data_pedido. A query filtra por data_pedido. E continua lenta como se o índice não existisse.

Não é bug do banco. É que o índice foi construído sobre uma coisa e você está perguntando por outra.

O que um índice é

Pense na lista telefônica: ela é ordenada por nome. Achar “Silva” é rápido — você abre no meio, decide para que lado ir e repete.

Agora imagine a pergunta “quais nomes têm exatamente 5 letras?”. A lista continua ordenada, mas não por isso. Não tem atalho: só lendo tudo.

O índice do banco é a mesma coisa. Ele guarda os valores da coluna do jeito que eles são, em ordem.

Onde a query se perde

SELECT * FROM pedidos
WHERE YEAR(data_pedido) = 2026

O índice guarda datas completas, não anos. Para saber o YEAR() de cada linha, o banco precisa calcular — e para calcular, precisa ler linha por linha. A ordenação do índice deixou de servir e ele varre a tabela inteira.

Os mesmos casos aparecem com texto:

WHERE UPPER(nome) = 'MARIA'      -- índice guarda "Maria", não "MARIA"
WHERE CAST(id AS TEXT) = '123'   -- índice guarda número, não texto

O conserto: mexa no valor, não na coluna

A regra é deixar a coluna intacta de um lado da comparação e ajustar o outro lado:

-- em vez de YEAR(data_pedido) = 2026
SELECT * FROM pedidos
WHERE data_pedido >= '2026-01-01'
  AND data_pedido <  '2027-01-01'

Agora a pergunta está na mesma língua do índice — uma faixa de datas — e ele volta a servir. O resultado é idêntico; só o caminho até ele mudou.

Mesma ideia para o texto: compare nome = 'Maria' e, se precisar mesmo ignorar maiúscula, resolva com a colação da coluna ou com um índice criado sobre a expressão, em vez de aplicar a função na hora da consulta.

Pra lembrar

Sempre que o WHERE estiver lento com índice criado, procure uma função em volta da coluna. YEAR(), UPPER(), CAST(), SUBSTRING(), até uma conta simples como valor * 1.1.

Coluna limpa de um lado, valor calculado do outro. Essa troca costuma ser a diferença entre milissegundos e minutos — e não muda o resultado em nada.