Pular para o conteúdo

Arquitetura de software · Dados · 7 min de leitura

Índices de banco de dados

Um índice é um sumário ordenado que leva a consulta direto às linhas certas: transforma uma varredura da tabela inteira em poucos saltos, ao custo de escritas mais lentas.

Consulta → Raiz1Raiz → Nó a–m2Raiz → Nó n–zNó a–m → Folha3Folha → Linha da tabela: ponteiroponteiro4Consulta — WHERE email = ?ConsultaWHERE email = ?Raiz — a–m | n–zRaiza–m | n–zNó a–m — a–f | g–mNó a–ma–f | g–mNó n–zNó n–zFolha — chave → linhaFolhachave → linhaLinha da tabela — heapLinha da tabelaheap

Arraste para o lado para ver o diagrama inteiro.

Cada nível divide o espaço de busca; com centenas de chaves por nó, três ou quatro níveis cobrem milhões de linhas.

Por que acelera

Sem índice, o banco lê a tabela inteira (seq scan) para achar as linhas do WHERE. Com um índice em árvore B — o padrão no PostgreSQL e no MySQL — as chaves ficam ordenadas e a busca custa O(log n): de cada nó se desce para o filho certo até a folha, que aponta para a linha. A ordem também serve para ORDER BY, faixas (BETWEEN, >) e prefixos (LIKE 'abc%').

Tipos que valem conhecer

  • Árvore B: igualdade, faixas e ordenação; serve para quase tudo.
  • Composto (cliente_id, criado_em): vale para filtros que usam as colunas da esquerda para a direita; um filtro só por criado_em não aproveita.
  • De cobertura (INCLUDE): a consulta é respondida só pelo índice, sem ir à tabela.
  • Parcial (WHERE ativo): indexa só as linhas que importam e fica pequeno.
  • GIN: arrays, jsonb e busca de texto; hash: só igualdade.

Quando o índice não é usado

  • Função sobre a coluna: WHERE lower(email) = ? só usa um índice criado sobre lower(email).
  • LIKE '%abc' (curinga no começo) não aproveita a ordem.
  • Filtro pouco seletivo: se metade da tabela atende, ler tudo é mais barato e o planejador ignora o índice — e está certo.
  • Tipos diferentes na comparação (texto contra número) forçam conversão.

Na dúvida, rode EXPLAIN ANALYZE e veja se aparece Index Scan e quantas linhas foram lidas.

O custo

Cada índice é uma estrutura a mais para atualizar em todo INSERT, UPDATE e DELETE, e ocupa disco e memória. Crie índices para as consultas que existem de verdade (veja as mais lentas no pg_stat_statements), remova os que nunca são usados e, em tabelas grandes, crie com CREATE INDEX CONCURRENTLY para não travar as escritas.

Em resumo

Vantagens e custos

Vantagens
  • Consultas de segundos passam a milissegundos.
  • Índice de cobertura evita ir à tabela.
  • Índice único também garante a regra de negócio (e-mail único).
Custos e riscos
  • Escritas mais lentas e mais disco.
  • Índices demais confundem o planejador e a manutenção.
  • Criar em tabela grande sem CONCURRENTLY trava escritas.

Perguntar à IA

Monte um prompt pronto sobre Índices de banco de dados na sua linguagem e no seu caso, e abra num chat gratuito.

ChatGPT Claude Perplexity

O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.

Referências

Continue aprendendo

Todos os temas de arquitetura de software →