9 tipos de índices de banco: guia técnico
Índices de banco de dados são estruturas auxiliares que reduzem o custo de leitura em troca de espaço e tempo de escrita. Os nove tipos mais usados vão do B-tree ao índice vetorial, cada um com um cenário ideal.
Índices de banco de dados são estruturas auxiliares que reduzem o custo de leitura em troca de espaço e tempo de escrita. Os nove tipos mais usados vão do B-tree ao índice vetorial, cada um com um cenário ideal.
Índices de banco de dados são estruturas auxiliares que reduzem o custo de leitura em troca de espaço em disco e tempo de escrita. Os nove tipos mais usados vão do B-tree ao índice vetorial, e a escolha errada transforma um ganho de milissegundos em um problema de armazenamento.
Os principais tipos de índices de banco de dados são B-tree, hash, bitmap, GiST, GIN, BRIN, colunar, invertido e vetorial. Cada um organiza as chaves de forma diferente e serve a um padrão de consulta: igualdade, intervalo, texto, geolocalização ou similaridade vetorial.
1. B-tree
É o índice padrão da maioria dos bancos relacionais, como PostgreSQL e MySQL. Mantém as chaves ordenadas em uma árvore balanceada, o que atende igualdade, intervalo e ordenação na mesma estrutura. O custo aparece na escrita: cada INSERT ou UPDATE reequilibra a árvore. Em tabelas com alto volume de gravação, o ganho de leitura precisa compensar esse overhead.
2. Hash
Armazena o hash da chave e só responde a comparações de igualdade. Não serve para WHERE data > '2024-01-01'. Onde funciona bem: tabelas de sessão ou cache, com chave única e consultas pontuais. O PostgreSQL desaconselha hash para uso geral, mas mantém suporte para casos específicos.
3. Bitmap
Representa cada valor distinto como um vetor de bits. Brilha em colunas de baixa cardinalidade, como status ou UF, especialmente em data warehouses. O problema é a concorrência: um UPDATE bloqueia grandes faixas do bitmap, o que inviabiliza o uso em sistemas transacionais com escrita frequente.
4. GiST (Generalized Search Tree)
Estrutura genérica para dados que não cabem em uma ordenação simples, como geometrias e intervalos. É a base de índices espaciais no PostGIS. Uma consulta do tipo "pontos dentro deste polígono" passa de varredura completa para busca em árvore. Exige extensão específica e operadores compatíveis.
5. GIN (Generalized Inverted Index)
Mapeia cada elemento de um valor composto para as linhas que o contêm. É o índice típico para arrays, JSONB e busca textual no PostgreSQL. Em uma coluna tags com 50 valores possíveis, o GIN evita varrer a tabela inteira. O custo: escrita mais lenta e índice maior que o B-tree equivalente.
6. BRIN (Block Range Index)
Guarda o mínimo e o máximo de cada bloco de páginas, não de cada linha. Ocupa uma fração do espaço de um B-tree. Funciona quando os dados estão fisicamente ordenados, como tabelas de log com timestamp crescente. Se a ordem física se quebra, o BRIN perde eficácia e volta a ler blocos demais.
7. Colunar
Em vez de agrupar por linha, agrupa por coluna. Bancos analíticos como ClickHouse e Amazon Redshift usam esse layout para varrer milhões de registros em uma única coluna sem tocar nas demais. É a escolha para agregações e relatórios, não para transações ponto a ponto.
8. Invertido
O índice invertido associa cada termo a uma lista de documentos que o contêm. É a espinha dorsal de mecanismos de busca como Elasticsearch e Apache Lucene. Suporta relevância, sinônimos e busca por frase. Em bancos relacionais, aparece via extensões de full-text search.
9. Vetorial
Projetado para similaridade entre vetores de alta dimensão, usado em aplicações de IA e busca semântica. Estruturas como HNSW e IVF aproximam o vizinho mais próximo sem comparar todos os vetores. A troca é explícita: recall ligeiramente menor em nome de latência muito menor.
Qual escolher
Comece pelo B-tree, que resolve a maioria dos casos transacionais. Se a coluna tem baixa cardinalidade e o sistema é analítico, avalie bitmap. Para JSONB, arrays ou texto, GIN. Para séries temporais ordenadas fisicamente, BRIN. Busca semântica pede índice vetorial, não B-tree com função de distância. Meça com EXPLAIN ANALYZE antes de criar o próximo índice: cada estrutura adicional encarece toda escrita na tabela.
FAQ
O que é um índice de banco de dados?
É uma estrutura auxiliar que mantém uma cópia ordenada ou mapeada de uma ou mais colunas, permitindo ao banco localizar linhas sem varrer a tabela inteira. O ganho vem às custas de espaço em disco e de tempo extra em cada operação de escrita.
Qual é o tipo de índice mais usado?
O B-tree. É o padrão em PostgreSQL, MySQL, SQL Server e Oracle porque atende igualdade, intervalos e ordenação com bom desempenho geral. Os demais tipos existem para padrões de consulta que o B-tree não cobre bem.
Quando não usar índice?
Em tabelas pequenas, colunas com pouca seletividade ou cargas dominadas por escrita. Um índice em coluna booleana raramente ajuda e ainda pesa em cada INSERT. O planejador pode ignorá-lo de qualquer forma.
Índice hash é melhor que B-tree para igualdade?
Em teoria, o hash tem busca em tempo constante. Na prática, o B-tree entrega desempenho próximo e cobre mais casos, por isso é o padrão. O hash fica restrito a cenários muito específicos de chave única.
O que é índice vetorial?
É uma estrutura que organiza vetores de embedding para permitir busca por similaridade aproximada. Aparece em bancos como pgvector, Milvus e Pinecone, usada em recomendação, busca semântica e aplicações com modelos de linguagem.
Posso ter vários índices na mesma tabela?
Pode, mas cada índice adicional aumenta o custo de escrita e o espaço ocupado. O ideal é criar índices para os padrões de consulta realmente frequentes e revisar periodicamente os que nunca aparecem nos planos de execução.