Ramos da InformáticaBanco de DadosBiscuit PostgreSQL: Indexação LIKE de Alta Performance

Biscuit PostgreSQL: Indexação LIKE de Alta Performance

-

Se você trabalha com PostgreSQL, já deve ter enfrentado o desafio de tornar consultas com LIKE e curingas (% e _) realmente rápidas. Este tutorial completo vai te mostrar como alcançar uma performance excepcional em buscas textuais utilizando a extensão Biscuit PostgreSQL.

O Biscuit é uma extensão inovadora que implementa um método próprio de acesso a índices, projetado especificamente para padrões LIKE e ILIKE. Ele oferece ganhos significativos em relação ao tradicional pg_trgm. Vamos explorar tudo o que você precisa saber para implementá-lo.


O que é a extensão Biscuit?

O nome é um acrônimo para Bitmap Indexed Searching with Comprehensive Union and Intersection Techniques. Em vez de depender de trigramas (como faz o pg_trgm), o Biscuit constrói e consulta bitmaps posicionais para cada caractere de uma string.

Isso torna o processo determinístico: os resultados são exatos e não exigem uma etapa de verificação posterior na tabela (recheck no heap), que costuma ser a principal fonte de lentidão em outras abordagens.

Como Funciona a Indexação por Bitmaps?

Para cada string indexada, a extensão cria conjuntos estratégicos de bitmaps:

  • Índice Positivo (Forward): Mapeia a posição de cada caractere a partir do início da string (Ex: em "Hello", cria-se H@0, e@1, l@2).
  • Índice Negativo (Backward): Mapeia a posição de cada caractere a partir do final (Ex: o@-1 para o último, l@-2 para o penúltimo).
  • Índices de Tamanho (Length):
    • length[5]: IDs de strings com exatamente 5 caracteres.
    • length_ge[3]: IDs de strings com 3 ou mais caracteres.

Para uma consulta como LIKE 'abc%def', o Biscuit executa operações lógicas AND entre os bitmaps:

-- 1. Encontra candidatos que começam com "abc" 
Candidatos = pos[a@0] ∩ pos[b@1] ∩ pos[c@2]

-- 2. Filtra os que terminam com "def" (usando índices negativos)
Candidatos = Candidatos ∩ neg[f@-1] ∩ neg[e@-2] ∩ neg[d@-3]

-- 3. Garante que a string tenha pelo menos 6 caracteres
Candidatos = Candidatos ∩ length_ge[6]

O resultado é um conjunto de IDs que correspondem exatamente ao padrão, sem a necessidade de ler a tabela original para confirmar.


Instalação

Pré-requisitos: PostgreSQL 16 (ou superior) e ferramentas de build (gcc, make, pg_config). É recomendável ter a biblioteca CRoaring para otimização das operações com bitmaps.

Método 1: Instalação via PGXN (Recomendado)

pgxn install biscuit
psql -d seu_banco_de_dados -c "CREATE EXTENSION biscuit;"

Método 2: Compilando do Código Fonte

git clone https://github.com/Crystallinecore/biscuit.git
cd biscuit
make
sudo make install
psql -d seu_banco_de_dados -c "CREATE EXTENSION biscuit;"

🚀 Guia Rápido de Uso

1. Criando um Índice Biscuit

A sintaxe é idêntica à de outros índices, utilizando USING biscuit.

-- Índice básico em uma coluna de texto
CREATE INDEX idx_users_name ON users USING biscuit(name);

-- Índice em múltiplas colunas
CREATE INDEX idx_products_search ON products USING biscuit(name, description, category);

2. Realizando Consultas

O otimizador do PostgreSQL passará a usar o índice automaticamente para padrões LIKE.

-- Busca por substring (cenário mais otimizado)
SELECT * FROM users WHERE name LIKE '%john%';

-- Busca por sufixo (utiliza os índices negativos)
SELECT * FROM logs WHERE message LIKE '%ERROR';

3. Operadores ILIKE e NOT LIKE

O Biscuit possui suporte nativo para buscas case-insensitive e negação de bitmaps de forma altamente eficiente.

-- Case-insensitive
SELECT * FROM users WHERE name ILIKE '%son';

-- Negação (excluindo padrões)
SELECT * FROM users WHERE name LIKE '%a%' AND name NOT LIKE '%3%';

4. Índices com Expressões

Você pode indexar expressões, como a função LOWER(), para forçar buscas case-insensitive manuais:

CREATE INDEX idx_users_lower_name ON users USING biscuit(LOWER(name));

Vantagens vs. Desvantagens

✔️ Vantagens ❌ Desvantagens
Alta Performance: Imbatível em buscas com curingas, especialmente %texto%. Residente em Memória: O índice não é persistido em disco; é reconstruído na inicialização.
Sem Recheck: Resultados determinísticos eliminam a lentidão da verificação de tabela. Consumo de RAM: Pode consumir mais memória que o pg_trgm por armazenar bitmaps.
Multi-colunas Inteligente: Reordena filtros automaticamente para executar os mais seletivos primeiro. Sem Suporte a Regex: Limitado a LIKE/ILIKE. Não atende expressões regulares.
Otimizado para LIMIT e COUNT: Pula ordenações desnecessárias em agregações. Custo de Escrita: Não é o ideal para tabelas com altíssimo volume de INSERT/UPDATE.

Biscuit ou pg_trgm: Qual Escolher?

Característica Biscuit pg_trgm (GIN)
Padrões com Curingas ✔️ Nativo e exato ✔️ Aproximado (com recheck)
Overhead de Recheck ✔️ Nenhum ❌ Sempre presente
Busca por Substring (%texto%) ✔️ Excelente ✔️ Boa (mas com recheck)
Uso de Memória ⚠️ Mais alto (RAM) ✔️ Menor (Disco)
Busca por Similaridade/Regex ❌ Não ✔️ Sim

Escolha o Biscuit se:

  • Sua aplicação faz muitas buscas por substring ('%termo%').
  • O banco tem alta taxa de leitura (SELECT) e memória RAM sobrando.
  • Você precisa de tempos de resposta extremamente previsíveis e exatos.

Escolha o pg_trgm se:

  • Há pouca memória RAM disponível no servidor.
  • Você precisa de buscas por similaridade fonética ou expressões regulares.
  • A tabela sofre operações de escrita intensas e constantes.

Exemplo de Benchmark

Em testes com 1 milhão de registros, o Biscuit apresentou vantagem clara em cenários de substring e consultas complexas:

Tipo de Consulta Biscuit pg_trgm
Busca por Substring ('%texto%') 3.60 ms 3.79 ms
Padrões Complexos ('%a%b%c%') 202.4 ms 211.3 ms
Busca Case-Sensitive 0.70 ms N/A

Monitoramento e Boas Práticas

Para inspecionar o estado interno do índice (registros, tombstones e otimizações), utilize a função nativa:

SELECT biscuit_index_stats('idx_products_search'::regclass);
  • Índices Parciais: Se suas consultas costumam ter filtros fixos (WHERE status = 'active'), crie índices parciais para economizar RAM.
  • Reindexação: Em tabelas com muitos DELETEs, rode um REINDEX periodicamente para limpar os tombstones da memória.
  • Homologação Primeiro: Por ser uma extensão em desenvolvimento ativo, teste sempre seu workload em um ambiente seguro antes de enviar para produção.

Referências

Continue aprendendo

Se você quer deixar a arquitetura do seu ecossistema de desenvolvimento ainda mais parruda e produtiva, dê um confere nestes artigos:

🚀 Apoio Independente de um sonho

Ajude a manter o código livre e o sonho vivo de viver de produzir conteúdos para você!

Escrever tutoriais profundos e sem paywalls exige tempo e dedicação. Meu grande sonho é me dedicar 100% a produzir conteúdos, criar ferramentas open-source, abrir uma comunidade ativa e, em breve, lançar um canal no YouTube.

Se este artigo te poupou horas de trabalho, considere enviar um "Pix Livre" de qualquer valor para apoiar esta jornada. Cada incentivo me aproxima de viver exclusivamente para a nossa comunidade dev! 💚

QR Code Pix Livre - Ramos da Informática
Escaneie com o app do seu banco ☕
Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

PostgreSQL: Como Dar Acesso Seguro para DBA Terceirizado

Aprenda a conceder acesso seguro e temporário para DBA terceirizado no PostgreSQL. Guia completo com pgaudit, privilégios granulares, expiração...

Um guia completo para Testcontainers no Node.js

O Testcontainers é uma biblioteca que fornece instâncias leves e descartáveis de bancos de dados, message brokers, navegadores ou...

Do Prompt ao Protótipo: Modelagem 3D com Text-to-CAD e Agentes de IA

Descubra como a modelagem 3D com Text-to-CAD e agentes de IA está transformando o design mecânico. Tutorial completo de instalação, skills...

ShadScan: Gere Código shadcn/ui a Partir de Prints

Descubra como o ShadScan usa IA para transformar prints de componentes UI em código shadcn/ui e Tailwind CSS pronto...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.
Masterclass Online

Automação de Busca de Vagas Tech com n8n e IA

Construa o seu próprio recrutador autônomo. Aprenda a varrer a internet, ler requisitos com LLMs e receber as vagas com match perfeito no seu Telegram ou Slack.

  • Workflows visuais com n8n
  • Filtros inteligentes de stack com IA
  • Alertas de vagas em tempo real na nuvem

Com o Especialista

Ramos de Souza Janones

Engenheiro Full Stack Sênior

Garantir Minha Vaga ➔ Inscrições via Sympla

Package.json Linter: Como Validar com ESLint Plugin

Aprenda a usar o eslint-plugin-package-json para validar e padronizar seu package.json automaticamente. Evite erros de publicação NPM, inconsistências em...

Masterclass Ensina Profissionais de TI a Automatizar a Busca por Vagas Usando IA e n8n

Encontrar a vaga ideal no mercado de tecnologia não precisa mais ser um processo manual, repetitivo e exaustivo. Uma...

Mais Lidos

Rotação de JWT para Segurança em Aplicações Críticas

Se você trabalha com autenticação em Single Page Applications...

Integrar Código no Google Docs (Guia Prático)

Quem utilize o Google Docs para enviar documentos contendo...

Livros sobre Inteligência Artificial com Node.js e JavaScript

Temos apresentado no site cursos de Inteligência Artificial, gratuitos...

Seja parceiro da Ramos da Informática

Sobre a Ramos da Informática. 🚀 Conectando Desenvolvedores e Entusiastas...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.
✨ Utilitários Dev

Ferramentas Práticas

Sem enrolação para adiantar o seu dia a dia.

Carreira Internacional

JOB NA GRINGA

Meta de Salário Remoto
U$ 5.000/mês

O mapa completo para programadores do Brasil conquistarem contratos internacionais e mudarem de vida financeira.

  • Vagas exclusivas semanais: Membros acessam vagas com 7 dias de antecedência.
  • Workshops e lives gravadas: Buscar vagas não é óbvio. Nós te mostraremos como.
  • 498 Portais de vagas: Que contratam Brasileiros direto na sua dashboard.
  • Mentorias com Recrutadores: Encontros semanais ao vivo com Erika Linares.
  • Inglês diário com foco em conversação: Treine para entrevistas num ambiente sem julgamentos.
  • Suporte pós-contratação: Contabilidade e recebimento legal com a menor taxa.
Garantir Minha Vaga

Inscrição segura via Hotmart

🚀 Apoio Independente

Ajude a manter o código livre e o sonho vivo!

Escrever tutoriais profundos exige tempo. Meu sonho é viver 100% produzindo conteúdo de qualidade para você!

Escaneie com o app do banco para enviar um "Pix Livre"

Se este conteúdo te ajudou, fortaleça essa jornada. Cada incentivo conta! 💚

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

O Sonho é Possível com seu Apoio!

Meu grande sonho é dedicar 100% do meu tempo a criar ferramentas open-source e tutoriais profundos para você. Se este conteúdo te ajudou, fortaleça essa jornada enviando um Pix Livre de qualquer valor. 💚

QR Code Pix Livre

Escaneie com o app do banco ☕