Por que sua query ignora o índice (e a função na coluna é a culpada)
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.