Banco de dados: índices GIN & JSONB
O curso parte da busca do catálogo de uma aplicação, que usava ILIKE em títulos jsonb e ignorava os índices GIN dessas colunas. Mostra como a classe de operadores decide o que um índice GIN atende. O jsonb_ops padrão não atende ILIKE; a gin_trgm_ops da pg_trgm indexa trechos de três caracteres. Depois vêm índices de expressão, que precisam bater caractere por caractere com a query, e o tamanho medido de jsonb_ops contra jsonb_path_ops. No fim vem a correção: dois índices substituídos e dois sem uso removidos.
O que você vai aprender
- ✓Como a classe de operadores decide quais operadores um índice GIN atende
- ✓O que o jsonb_ops padrão indexa e quais seis operadores ele registra
- ✓Indexar buscas com ILIKE sobre texto extraído de jsonb com pg_trgm e gin_trgm_ops
- ✓Criar índices de expressão que batem caractere por caractere com a query
- ✓Comparar jsonb_ops e jsonb_path_ops em tamanho de índice e operadores suportados
- ✓Remover índices GIN de colunas pelas quais nenhuma query filtra
Um índice GIN real, e uma query que nunca o tocou
O Catalog::SearchQuery é a classe por trás da busca do catálogo desta aplicação. Até 2 de setembro de 2026, ela filtrava cursos e aulas assim:
Ler a aula completa grátis →Currículo
7 aulasUm índice GIN real, e uma query que nunca o tocou
Um índice GIN na coluna jsonb de título ficou fora da busca com ILIKE, mas atendeu uma query de contenção.
jsonb_ops: o que a opclass padrão indexa
A classe padrão jsonb_ops registra seis operadores, como @> e existência de chave, e nenhum deles é LIKE ou ILIKE.
pg_trgm e gin_trgm_ops: indexando substrings, não documentos
A gin_trgm_ops da pg_trgm indexa trigramas, e buscas com ILIKE passam a usar índice a partir de três caracteres.
Índices de expressão precisam de sintaxe exata, não só da opclass certa
Um índice de expressão só é usado se a query escrever a mesma expressão, e cada locale ganhou o seu.
jsonb_ops vs jsonb_path_ops: uma troca real e medida
Em 50.000 linhas, o jsonb_path_ops ficou 56,7% menor que o jsonb_ops, mas não atende existência de chave.
A correção: uma migration, conferida antes e depois
A correção removeu dois índices GIN sem uso e trocou dois por índices de trigramas, sem mudar os testes.
Juntando tudo: escolhendo a estratégia certa de GIN para jsonb
Um guia de decisão liga cada forma de consultar uma coluna jsonb a jsonb_path_ops, jsonb_ops, gin_trgm_ops ou nenhum índice.