Beta
Por dentroBanco de dados2 min de leitura

Consulta lente sem indíce

A pergunta que chega: "o que acontece por dentro quando o banco não tem índice?"

O banco lê a tabela linha por linha até achar o que você pediu. Com índice no campo da busca ele vai direto na linha. O EXPLAIN mostra qual dos dois caminhos ele usou.

Atualizada em 28/10/2026

Antes e depois. À esquerda, sem índice: uma pilha de nove linhas da tabela, uma delas verde, e uma seta laranja descendo, com o rótulo lê linha por linha. À direita, com índice: uma árvore com 25000 na raiz, 8000 e 41000 logo abaixo, e a folha 4242 selecionada, com o rótulo vai direto na folha.

Duas formas de achar o cliente 4242: varrer a tabela inteira ou descer por uma árvore até a folha certa.

Sem índice, o banco lê tudo

Se não existe índice na coluna do filtro, o Postgres faz um Seq Scan: abre a tabela do começo ao fim e testa cada linha.1 Com mil linhas ninguém percebe. Com milhões, a mesma consulta fica lenta, porque o trabalho cresce junto com a tabela.

Desenho: a tabela cresce e o Seq Scan lê cada vez mais páginas, enquanto o Index Scan continua abrindo uma só
A tabela cresce, o Seq Scan cresce junto. Sem índice o banco lê mais páginas a cada crescimento. Com índice ele continua indo numa página só.

Índice no campo que você busca

O índice guarda os valores da coluna em ordem, com o endereço de cada linha.2 Vale criar nas colunas que aparecem no WHERE, no JOIN e no ORDER BY das consultas que você mais roda.3

sql
CREATE INDEX usuarios_email_idx
ON usuarios (email);

Ele tem custo: cada escrita na tabela também atualiza o índice, e ele ocupa disco. Por isso eu crio pro que a aplicação busca de verdade.

Confira com EXPLAIN

Rode EXPLAIN antes da consulta e leia o primeiro nó do plano.1 Seq Scan numa tabela grande com filtro que pega poucas linhas pede índice. Index Scan com Index Cond mostra que o índice entrou.

sql
EXPLAIN SELECT * FROM usuarios
WHERE email = 'maria@exemplo.com';
-- sem índice:
Seq Scan on usuarios
-- com índice:
Index Scan using usuarios_email_idx

Pra guardar

  1. Sem índice no filtro, o banco lê a tabela inteira (Seq Scan).
  2. Crie índice nas colunas do WHERE, JOIN e ORDER BY que você mais usa.
  3. Confira com EXPLAIN: o plano tem que mostrar o índice.

O que achou?

Conta grátis

Saiba quando sairo próximo contexto.

Com a conta grátis você abre os visuais, salva, grifa e pode receber um email quando sair contexto novo. Entra com um código no email, sem senha.

Ao se inscrever, você concorda com os Termos e a Política de Privacidade.