Indexação de Banco de Dados para Desenvolvedores Web

Backend2026-09-13TryQuickToolBox

Sua aplicação web parece rápida durante o desenvolvimento, mas conforme os dados crescem, consultas que antes retornavam em milissegundos agora levam segundos. Os usuários reclamam e a CPU do seu banco de dados dispara. O culpado geralmente são índices ausentes ou mal utilizados. A indexação é uma das habilidades de maior impacto para desenvolvedores backend, mas é frequentemente mal compreendida. Este guia explica como funcionam os índices de banco de dados, quando usá-los e como evitar armadilhas comuns.

O Que É um Índice de Banco de Dados?

Pense em um índice como o índice no final de um livro didático. Em vez de folhear cada página para encontrar um tópico, você o procura no índice, que aponta para as páginas corretas. Um índice de banco de dados funciona de forma semelhante: é uma estrutura de dados que permite ao mecanismo do banco de dados encontrar linhas rapidamente sem escanear a tabela inteira.

Sem um índice, uma consulta como SELECT * FROM users WHERE email = 'alice@example.com' força uma varredura completa da tabela — o banco de dados lê cada linha até encontrar uma correspondência. Com um índice em email, o banco de dados pode pular diretamente para a linha correspondente.

Como os Índices Funcionam nos Bastidores

A maioria dos bancos de dados relacionais usa índices B-tree (árvore balanceada) por padrão. Uma B-tree mantém os dados ordenados e permite buscas, acesso sequencial, inserções e exclusões em tempo logarítmico. É por isso que buscas indexadas são rápidas mesmo para milhões de linhas.

Outros tipos de índice incluem:

Para a maioria das aplicações web, os índices B-tree são o cavalo de batalha.

Quando Criar um Índice

Índices não são gratuitos — eles consomem armazenamento e tornam as escritas mais lentas. Crie-os de forma estratégica:

No entanto, evite indexar colunas raramente consultadas ou com cardinalidade muito baixa (por exemplo, uma flag booleana), a menos que sejam usadas em combinação com outras colunas.

Tipos de Índices e Seus Casos de Uso

Tipo de Índice Melhor Para Exemplo
Coluna única Filtros simples CREATE INDEX idx_email ON users(email);
Composto Consultas que filtram múltiplas colunas CREATE INDEX idx_name_age ON users(last_name, first_name);
Único Garantir unicidade CREATE UNIQUE INDEX idx_username ON users(username);
Parcial Indexar um subconjunto de linhas CREATE INDEX idx_active ON users(email) WHERE active = true;
Covering Consultas que precisam apenas de colunas indexadas CREATE INDEX idx_covering ON users(email, name);

Como Criar e Verificar Índices

Criar um índice é simples. Por exemplo, no PostgreSQL:

CREATE INDEX idx_users_email ON users(email);

Após criar um índice, verifique se ele está sendo usado. Use EXPLAIN (ou EXPLAIN ANALYZE) para ver o plano de consulta:

EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'alice@example.com';

Procure por "Index Scan" ou "Index Only Scan" em vez de "Seq Scan". Se você vir uma varredura sequencial, o índice pode não estar sendo usado devido a incompatibilidades de tipo, funções na coluna ou estatísticas desatualizadas.

Erros Comuns de Indexação

  1. Indexar tudo: Índices demais tornam as escritas lentas e desperdiçam espaço.
  2. Ignorar a ordem do índice composto: Para um índice composto em (a, b), consultas que filtram apenas por b não conseguem usar o índice de forma eficiente.
  3. Usar funções em colunas indexadas: WHERE YEAR(created_at) = 2025 impede o uso do índice. Em vez disso, use condições de intervalo: WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01'.
  4. Não atualizar as estatísticas: Os bancos de dados dependem de estatísticas para escolher índices. Execute ANALYZE regularmente.
  5. Ignorar a sobrecarga de escrita: Cada INSERT, UPDATE e DELETE precisa atualizar os índices. Para tabelas com muitas escritas, seja seletivo.

Técnicas Avançadas

Índices Covering

Um índice covering inclui todas as colunas necessárias para uma consulta, então o banco de dados pode recuperar os dados diretamente do índice sem tocar na tabela. Isso pode acelerar drasticamente consultas com muitas leituras.

Índices Parciais

Se você consulta frequentemente um subconjunto de linhas (por exemplo, usuários ativos), um índice parcial é menor e mais rápido que um índice completo.

Index-Only Scans

Alguns bancos de dados suportam index-only scans, onde todos os dados necessários estão no índice. Este é o tipo mais rápido de acesso a índice.

Monitoramento e Manutenção de Índices

Índices podem ficar inchados com o tempo devido a atualizações e exclusões. No PostgreSQL, VACUUM e REINDEX ajudam a manter o desempenho. No MySQL, OPTIMIZE TABLE pode reconstruir índices. Revise regularmente os logs de consultas lentas para identificar índices ausentes.

Perguntas Frequentes

Como sei se minha consulta está usando um índice?

Use o comando EXPLAIN (ou EXPLAIN ANALYZE) antes da sua consulta. A saída mostra se o banco de dados usa um index scan ou uma varredura sequencial.

Posso ter índices demais?

Sim. Cada índice adiciona sobrecarga às operações de escrita e consome armazenamento. Busque um equilíbrio com base na sua proporção de leituras/escritas.

Qual é a diferença entre um índice clusterizado e um não clusterizado?

Um índice clusterizado determina a ordem física das linhas na tabela (como uma chave primária no InnoDB). Um índice não clusterizado é uma estrutura separada que aponta para as linhas. Uma tabela pode ter apenas um índice clusterizado, mas muitos não clusterizados.

Pronto para otimizar seu banco de dados? Comece analisando suas consultas lentas e adicionando índices onde necessário. Para formatação e validação rápida de JSON, experimente nosso JSON Formatter — é gratuito e roda inteiramente no seu navegador.