CodeGym /Cursos /SQL SELF /Tipos principais de índices: B-TREE,

Tipos principais de índices: B-TREE, HASH, GIN, GiST

SQL SELF
Nível 37 , Lição 1
Disponível

Tipos principais de índices: B-TREE, HASH, GIN, GiST

Então, no mundo do PostgreSQL tem vários tipos de índices, e cada um foi feito pra uma missão diferente. É tipo escolher um meio de transporte: você pode ir de bike dar um rolê no parque, mas pra atravessar a cidade provavelmente vai de carro. Do mesmo jeito, cada índice serve melhor pra um tipo de tarefa.

No PostgreSQL, os tipos principais de índices são:

  • B-TREE índices: índices coringa, servem pra quase tudo.
  • HASH índices: otimizados pra comparação exata.
  • GIN índices: perfeitos pra busca em arrays e JSONB.
  • GiST índices: usados pra tipos de dados mais cabulosos, tipo dados geográficos.

Índices existem pra acelerar a busca de linhas. Eles têm 4 tipos diferentes de otimização: cada tipo acelera certas operações e lida melhor com certos tipos de dados.

Você não tem como controlar os índices além de escolher o tipo: nenhum ou um dos que citei acima. Agora bora ver cada um deles pra entender quando e como usar.

Índices B-TREE

B-TREE (vem de "balanced tree") — é o tipo de índice mais comum, a base do PostgreSQL. Esse índice cria uma estrutura em árvore, onde os dados ficam organizados pra facilitar busca, ordenação e filtragem.

Pensa numa biblioteca com estantes, onde cada estante tem livros em ordem alfabética. Se você procura um livro com a letra "M", não precisa olhar todos os livros — só ir direto pro meio. É mais ou menos assim que funcionam as árvores balanceadas.

Quando usar?

Quase sempre! Índices B-TREE são especialmente bons pra:

  • Busca por intervalos: WHERE price > 100.
  • Ordenação: ORDER BY name ASC.
  • Busca por igualdade: WHERE id = 42.

Exemplo de criação:

-- Criando índice B-TREE pra coluna price da tabela products:
CREATE INDEX idx_price ON products(price);

Quando você faz uma query tipo WHERE price > 100, o PostgreSQL vai usar esse índice e não precisa varrer a tabela toda.

Índices HASH

Índices HASH usam hash tables pra busca rápida. O ponto forte deles é comparação exata de valores. Mas tem uma limitação: HASH não serve pra busca por intervalos nem pra ordenação.

É tipo um fichário onde cada ficha tem um número certinho. Você pede a ficha 42, o bibliotecário acha na hora. Mas se pedir "me mostra as fichas de 40 a 50", não rola.

Índices HASH são só pra busca exata:

  • WHERE email = 'user@example.com'.
  • SELECT ... WHERE id = 123.

Se você precisa de intervalos ou ordenação, HASH não é pra você.

Exemplo de criação:

-- Criando índice hash pra coluna email da tabela users:
CREATE INDEX idx_email_hash ON users USING HASH (email);

Agora o PostgreSQL vai usar esse índice pra queries tipo WHERE email = 'user@example.com'.

Fica ligado: índices HASH são pra casos bem específicos e são menos usados que B-TREE.

Índices GIN (Generalized Inverted Index)

GIN é um índice especializado que faz mágica com arrays, JSONB e dados de texto. Imagina um armário com milhares de gavetas, cada uma com uma etiqueta. Na gaveta "maçã" tem todas as maçãs, na "banana" só banana. Pra achar maçã ou banana, você vai direto na gaveta certa, sem fuçar tudo.

Índices GIN são pra:

  • Busca em arrays: @> (contém), <@ (está contido).
  • Dados JSONB: WHERE jsonb_data @> '{"chave": "valor"}'.

Exemplo de criação

-- Criando índice GIN pra coluna tags, que tem arrays:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);

Agora o PostgreSQL consegue achar rapidinho produtos com tags tipo "eletrônicos" e "recomendados".

Índices GiST (Generalized Search Tree)

Índices GiST são ferramentas poderosas pra lidar com tipos de dados mais complexos, tipo coordenadas geográficas e intervalos. Eles criam árvores otimizadas pra busca espacial e por intervalos.

Pensa num mapa da cidade, onde cada ponto tá marcado pelas coordenadas. Dá pra achar rapidinho todos os pontos num raio de 5 km de onde você tá.

GiST serve pra:

  • Dados geográficos: SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance).
  • Busca por intervalos: WHERE date_range && '[2023-01-01, 2023-12-31]'.

Exemplo:

-- Criando índice GiST pra coluna location, que tem dados geográficos:
CREATE INDEX idx_location_gist ON places USING GiST (location);

Agora dá pra fazer queries geográficas cabulosas, tipo buscar os pontos mais próximos.

Tabela comparativa dos índices

Tipo de índice Serve pra... Exemplos de uso Observações
B-TREE Busca por intervalos, ordenação price > 100, ORDER BY name ASC Índice coringa.
HASH Checagem exata de igualdade email = 'user@example.com', id = 42 Não suporta intervalos.
GIN Arrays, JSONB tags @> '{tech}', jsonb_data @> '{"chave": "valor"}' Mais rápido pra dados complexos.
GiST Geografia, intervalos, distâncias ST_DWithin(geom, point, distance) Usado pra geodados.

Agora você já tá por dentro dos tipos principais de índices no PostgreSQL e como usar cada um. Lembra: escolher o índice certo é estratégico e faz toda diferença na velocidade das suas queries. Xeque-mate nos lags!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION