Índices B-tree vs Hash vs GiST vs GIN
Compare os principais tipos de índice no PostgreSQL e escolha o mais adequado para consultas de igualdade, intervalo, geometria, JSON e texto completo.
Índices B-tree vs Hash vs GiST vs GIN é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Visão Geral dos Tipos de Índice
PostgreSQL tem vários tipos de índice, cada um otimizado para diferentes padrões de acesso:
- Árvore B — igualdade e intervalo (padrão)
- Hash — apenas igualdade
- GiST — geométrico, texto completo e personalizado
- GIN — valores compostos (matrizes, JSONB e texto completo)
- BRIN — intervalo de blocos — tabelas enormes e ordenadas
- SP-GiST — árvores particionadas por espaço
Árvore B: o Padrão
Usada em 95% dos casos. É compatível com =, <, <=, >, >=, BETWEEN, ORDER BY:
CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);Índice Hash
Apenas buscas por igualdade. Seguro contra falhas desde PG 10. Menor e um pouco mais rápido que uma árvore B para igualdade pura, mas com uso muito específico:
CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.Índice GiST
Árvore de Busca Generalizada — conectável e compatível com tipos de intervalo, tipos geométricos, endereços IP e texto completo:
CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.
CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.Índice GIN
Índice Invertido Generalizado — ideal para valores compostos em que cada item corresponde a muitas linhas:
CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators
CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queriesÍndice BRIN
Os índices de intervalo de blocos resumem intervalos de valores a cada N páginas. São minúsculos (quilobytes para tabelas de terabytes), mas só são eficazes quando os dados estão ordenados fisicamente pela coluna indexada:
CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.Comparando Tamanhos
Para uma tabela com um bilhão de linhas:
- Árvore B em um BIGINT: ~30 GB
- BRIN em um TIMESTAMPTZ: ~1 MB
BRIN é muito menor, mas só supera a árvore B em consultas sequenciais ou ordenadas.
Escolhendo um Tipo de Índice
Fluxo de decisão:
- Igualdade + intervalo em um valor escalar → árvore B
- Igualdade em um conjunto escalar enorme → árvore B (Hash somente após medições)
- Matrizes / JSONB / texto completo → GIN
- Tipos de intervalo, geometria e texto aproximado → GiST
- Tabela enorme e ordenada, somente com acréscimos → BRIN
Compromissos do GIN
GIN é o mais rápido para consultas do tipo "encontre todas as linhas que contêm X", mas é mais lento para INSERT/UPDATE que uma árvore B. Para tabelas com muitas escritas, considere fastupdate=off para controlar a lista pendente do GIN.
Classes de Operadores
Cada tipo de índice funciona com operadores específicos. JSONB usa jsonb_path_ops para índices menores e mais rápidos, somente para contenção:
CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.Índices Compostos por Tipo
Índices compostos de árvore B usam correspondência pelo prefixo mais à esquerda. Índices compostos GIN funcionam, mas são maiores; geralmente você cria índices GIN separados de uma única coluna.
Recapitulação
Escolha o tipo de índice adequado à consulta.
- Árvore B: padrão
- GIN: matrizes/JSONB/texto completo
- GiST: intervalos/geometria/aproximação
- BRIN: sequencial/somente com acréscimos
Verificação Rápida
Você está indexando uma coluna TEXT[] para consultas de "contém". Qual tipo de índice é adequado?
Aprenda SQL com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 46
- Aulas
- 183
Perguntas Frequentes
A aula “Índices B-tree vs Hash vs GiST vs GIN” é grátis?
Sim — o texto completo de “Índices B-tree vs Hash vs GiST vs GIN” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Índices B-tree vs Hash vs GiST vs GIN”?
Compare os principais tipos de índice no PostgreSQL e escolha o mais adequado para consultas de igualdade, intervalo, geometria, JSON e texto completo. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Índices B-tree vs Hash vs GiST vs GIN”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Índices B-tree vs Hash vs GiST vs GIN
- Índices compostos e ordem das colunas
- Índices parciais e de expressão
- Manutenção de índices e fragmentação