Índice GIN
¿Qué es un índice GIN en PostgreSQL?
Un índice GIN (índice invertido generalizado) asocia cada elemento dentro de un valor, como un elemento de un arreglo, una clave JSONB o una palabra de búsqueda de texto, con las filas que lo contienen.
GIN significa Generalized Inverted Index (índice invertido generalizado). Está diseñado para valores compuestos, en los que cada ítem indexado contiene varios elementos, y para consultas que buscan ítems que contienen elementos concretos. Los usos típicos son arreglos, jsonb y búsqueda de texto completo.
Con las clases de operadores predeterminadas, GIN admite operadores como @> (contiene) y && (se superpone) para arreglos, y @> junto con los operadores de existencia de claves para jsonb. Las búsquedas son rápidas, pero las inserciones y actualizaciones cuestan más que con un B-tree. El parámetro de almacenamiento fastupdate, activado de forma predeterminada, guarda las entradas nuevas en una lista pendiente para suavizar ese costo.
Ejemplo
El ejemplo indexa una columna text[] con GIN y le pregunta a EXPLAIN por las filas cuyas etiquetas incluyen t42. La salida muestra un Bitmap Index Scan on docs_tags_gin.
CREATE TABLE docs (id int PRIMARY KEY, tags text[]);
INSERT INTO docs
SELECT g, ARRAY['t' || (g % 100), 'u' || (g % 7)] FROM generate_series(1, 100000) AS g;
CREATE INDEX docs_tags_gin ON docs USING gin (tags);
ANALYZE docs;
EXPLAIN SELECT id FROM docs WHERE tags @> ARRAY['t42'];SQL simple para PostgreSQL 16 o 17 estándar, sin extensiones. Ejecútalo en una base de datos vacía que puedas descartar.
Fuentes
Documentación oficial de PostgreSQL (en inglés).