Indexer JSONB avec GIN
Créez des index GIN sur des documents JSONB et utilisez jsonb_path_ops pour accélérer les requêtes d’inclusion.
Indexer JSONB avec GIN est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Pourquoi utiliser GIN pour JSONB
Les documents JSONB comportent de nombreux « éléments » (paires clé/valeur et éléments de tableaux). GIN (index inversé généralisé) est conçu pour les requêtes du type « lignes dont le document contient X ».
Index GIN par défaut
La classe d’opérateurs par défaut prend en charge @>, ?, ?| et ?& :
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 : plus petit et plus rapide
Deux fois moins volumineux et plus rapide pour les requêtes limitées à l’inclusion, mais prend en charge ONLY @> :
CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- Supports @>
-- Does NOT support ? ?| ?&
SELECT * FROM events WHERE data @> '{"type":"login"}';Indexer un seul chemin
Si vous n’interrogez qu’une seule clé, un index d’expression en arbre B sur la valeur extraite est encore plus rapide :
CREATE INDEX events_user_id_idx
ON events (((data->>'user_id')::BIGINT));
SELECT * FROM events WHERE (data->>'user_id')::BIGINT = 42;Indexer dans des tableaux
Utilisez un index GIN sur le chemin du tableau :
CREATE INDEX events_tags_gin
ON events USING GIN ((data->'tags'));
SELECT * FROM events WHERE data->'tags' @> '["admin"]'::JSONB;Combiner un index JSONB avec d’autres filtres
Les prédicats composites peuvent utiliser l’index GIN pour la partie JSONB et un autre index pour les éléments qui ne sont pas en JSONB :
EXPLAIN ANALYZE
SELECT * FROM events
WHERE data @> '{"type":"login"}'
AND ts >= NOW() - INTERVAL '7 days';
-- BitmapAnd: GIN index on data, B-tree on tsPerformances d’écriture de GIN
Les mises à jour d’un index GIN sont plus coûteuses que celles d’un arbre B. Pour les tables soumises à un très grand nombre d’écritures, l’option fastupdate regroupe les mises à jour GIN dans une liste d’attente, vidée par VACUUM.
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');Taille des index
Les index GIN sur JSONB peuvent être volumineux. Pour les très grandes tables, envisagez :
- d’indexer uniquement certains chemins (index d’expression)
- de passer à jsonb_path_ops pour les requêtes limitées à l’inclusion
- de placer les champs très sollicités dans de vraies colonnes
Combiner avec les trigrammes
Pour effectuer une recherche textuelle approximative dans JSONB, extrayez le contenu dans une expression TEXT et ajoutez un index GIN pg_trgm :
CREATE INDEX events_message_trgm
ON events USING GIN ((data->>'message') gin_trgm_ops);Quand l’indexation n’aide pas
Si votre filtre concerne chaque ligne (sélectivité très faible), le planificateur peut choisir un parcours séquentiel même avec l’index. Utilisez EXPLAIN ANALYZE pour le confirmer.
Gérer les index JSONB
Les index GIN gonflent comme tous les autres index. Utilisez régulièrement REINDEX CONCURRENTLY :
REINDEX INDEX CONCURRENTLY events_data_gin;Récapitulatif
GIN transforme les filtres JSONB en recherches s’effectuant en quelques millisecondes.
- GIN par défaut : @>, ?, ?|, ?&
- jsonb_path_ops : plus petit, limité à l’inclusion
- Arbre B d’expression sur un scalaire extrait : le plus rapide pour une seule clé
Vérification rapide
Vous interrogez uniquement data @> ... sur une colonne JSONB. Quel index offre la plus petite taille tout en prenant en charge toutes les fonctionnalités ?
Questions Fréquemment Posées
La leçon « Indexer JSONB avec GIN » est-elle gratuite ?
Oui — le texte complet de « Indexer JSONB avec GIN » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Indexer JSONB avec GIN » ?
Créez des index GIN sur des documents JSONB et utilisez jsonb_path_ops pour accélérer les requêtes d’inclusion. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Indexer JSONB avec GIN » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- JSONB ou JSON : quand utiliser chacun
- Opérateurs de chemin : -> ->> @>
- Indexer JSONB avec GIN
- Modélisation : quand JSONB l’emporte sur la normalisation