Indexación de JSONB con GIN
Cree índices GIN sobre documentos JSONB y utilice jsonb_path_ops para realizar consultas de contención rápidas.
Indexación de JSONB con GIN es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Por qué utilizar GIN para JSONB
Los documentos JSONB tienen muchos «elementos» (pares clave-valor y elementos de matrices). GIN (índice invertido generalizado) está diseñado para consultas del tipo «filas cuyo documento contiene X».
Índice GIN predeterminado
La clase de operador predeterminada admite @>, ?, ?| y ?&:
CREATE INDEX events_data_gin ON events USING GIN (data);
-- These now use the index:
SELECT * FROM events WHERE data @> '{"type":"login"}';
SELECT * FROM events WHERE data ? 'error';jsonb_path_ops: más pequeño y rápido
Ocupa la mitad y es más rápido para consultas que solo comprueban la contención, pero SOLO admite @>:
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- Supports @>
-- Does NOT support ? ?| ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';Indexar una sola ruta
Si solo consulta una clave, un índice B-tree de expresión sobre el valor extraído es aún más rápido:
CREATE INDEX events_user_id_idx
ON events (((data->>'user_id')::BIGINT));
SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;Indexación dentro de matrices
Utilice un índice GIN sobre la ruta de la matriz:
CREATE INDEX events_tags_gin
ON events USING GIN ((data->'tags'));
SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;Combinar un índice JSONB con otros filtros
Los predicados compuestos pueden utilizar el índice GIN para la parte JSONB y otro índice para la parte que no es JSONB:
EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on tsRendimiento de escritura de GIN
Las actualizaciones de GIN son más costosas que las de B-tree. En tablas con muchas escrituras, la opción fastupdate agrupa las actualizaciones de GIN en una lista de espera que VACUUM vacía.
CREATE INDEX events_data_gin ON events USING GIN (data) WITH (fastupdate = on);
-- Flush manually if needed:
SELECT gin_clean_pending_list('events_data_gin');Tamaño del índice
Los índices GIN de JSONB pueden ser grandes. Para tablas enormes, considere:
- Indexar solo rutas específicas (índice de expresión)
- Cambiar a jsonb_path_ops para consultas que solo comprueban la contención
- Separar los campos críticos en columnas reales
Combinación con trigramas
Para búsquedas de texto aproximadas dentro de JSONB, extraiga el valor como una expresión TEXT y añada un índice GIN de pg_trgm:
CREATE INDEX events_message_trgm
ON events USING GIN ((data->>'message') gin_trgm_ops);Cuándo la indexación no ayuda
Si el filtro afecta a todas las filas (selectividad muy baja), el planificador puede elegir un recorrido secuencial incluso con el índice. Utilice EXPLAIN ANALYZE para confirmarlo.
Mantenimiento de los índices JSONB
Los índices GIN se fragmentan como cualquier otro índice. Utilice REINDEX CONCURRENTLY periódicamente:
REINDEX INDEX CONCURRENTLY events_data_gin;Resumen
GIN convierte los filtros JSONB en búsquedas que tardan milisegundos.
- GIN predeterminado: @>, ?, ?|, ?&
- jsonb_path_ops: más pequeño y solo para contención
- B-tree de expresión sobre un escalar extraído: el más rápido para una sola clave
Comprobación rápida
Solo consulta data @> ... en una columna JSONB. ¿Qué índice ofrece el menor tamaño con compatibilidad completa con las funciones necesarias?
Preguntas frecuentes
¿La lección «Indexación de JSONB con GIN» es gratis?
Sí — el texto completo de «Indexación de JSONB con GIN» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Indexación de JSONB con GIN»?
Cree índices GIN sobre documentos JSONB y utilice jsonb_path_ops para realizar consultas de contención rápidas. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Indexación de JSONB con GIN»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- JSONB frente a JSON: cuándo usar cada uno
- Operadores de rutas: -> ->> @>
- Indexación de JSONB con GIN
- Modelado: cuándo JSONB supera a la normalización