Indici Hash, GIN e GiST
Comprenda i casi d'uso e i vantaggi degli indici hash, GIN e GiST per specifici tipi di dati e pattern di query.
Indici Hash, GIN e GiST è una lezione PostgreSQL Performance & Query Optimization gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento PostgreSQL Performance & Query Optimization, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso PostgreSQL Performance & Query Optimization include 4 lezioni in totale.
Oltre le basi dei B-Tree
Probabilmente ha già incontrato gli indici B-Tree, eccellenti per le corrispondenze esatte e le scansioni per intervallo su singole colonne. Ma cosa succede con tipi di dati più complessi o schemi di query particolari?
PostgreSQL offre tipi di indice specializzati per ottimizzare questi scenari specifici, consentendo query efficienti nei casi in cui i B-Tree non sono sufficienti.
Indici Hash per l'uguaglianza
Un indice Hash memorizza un valore hash per ogni colonna indicizzata. È ottimizzato per query di uguaglianza molto rapide, che utilizzano l'operatore =.
- Lo si può immaginare come una ricerca in un dizionario: è estremamente veloce se si conosce la chiave esatta.
- Può essere più veloce dei B-Tree per semplici verifiche di uguaglianza su tabelle molto grandi, soprattutto in presenza di molti duplicati.
Limitazioni degli indici Hash
Sebbene siano veloci per le uguaglianze, gli indici Hash presentano alcune limitazioni importanti:
- Nessuna scansione per intervallo: non è possibile utilizzarli per query con
>,<oBETWEEN. - Nessun ordinamento: non memorizzano i dati in un ordine specifico, quindi non sono utili per le clausole
ORDER BY. - Sicurezza in caso di arresto anomalo: storicamente non erano sicuri in caso di arresto anomalo. Sebbene siano stati migliorati nelle versioni più recenti di PostgreSQL, i B-Tree sono ancora generalmente preferiti per i dati critici grazie alla loro robustezza.
Indici GIN: General Inverted Index
GIN è l'acronimo di General Inverted Index. È progettato per tipi di dati che contengono più valori individuali, come array, documenti JSONB o lessemi per la ricerca full-text.
È come indicizzare il contenuto di un campo, non solo il campo stesso. In questo modo è possibile cercare molto rapidamente gli elementi all'interno di queste strutture complesse, utilizzando operatori come @> (contiene).
Esempio di GIN: dati array
Vediamo come un indice GIN può facilitare le query su una colonna array. Creeremo una tabella, inseriremo alcuni dati, quindi aggiungeremo un indice GIN e lo interrogheremo.
Noti l'operatore @>, utilizzato per verificare se un array contiene elementi specifici.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
tags TEXT[]
);
INSERT INTO products (name, tags) VALUES
('Laptop', '{"electronics", "gadget"}'),
('Desk Chair', '{"furniture", "office"}'),
('Monitor', '{"electronics", "display", "office"}');
CREATE INDEX idx_products_tags ON products USING GIN (tags);
SELECT name FROM products WHERE tags @> '{"electronics"}';
Indici GiST: Generalized Search Tree
GiST è l'acronimo di Generalized Search Tree. È una struttura di indice estremamente flessibile, in grado di gestire molti tipi diversi di query, soprattutto quelle che coinvolgono tipi di dati non standard o operatori complessi.
Principali casi d'uso:
- Dati spaziali: ad esempio, trovare punti all'interno di un poligono o oggetti che si sovrappongono.
- Tipi intervallo: ad esempio, trovare periodi temporali o intervalli numerici sovrapposti.
- Ricerca full-text: sebbene per questo scopo GIN sia spesso più veloce.
Esempio di GiST: dati spaziali
Ecco un esempio di utilizzo di GiST con il tipo integrato box di PostgreSQL per trovare oggetti all'interno di una determinata area rettangolare. Utilizziamo l'operatore && per indicare la "sovrapposizione".
CREATE TABLE locations (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
area BOX
);
INSERT INTO locations (name, area) VALUES
('Park A', '((0,0),(10,10))'),
('Building B', '((5,5),(15,15))'),
('River C', '((12,1),(18,8))');
CREATE INDEX idx_locations_area ON locations USING GiST (area);
SELECT name FROM locations WHERE area && '((7,7),(12,12))';
GIN e GiST per FTS
Sia GIN sia GiST possono essere utilizzati per la ricerca full-text (FTS) in PostgreSQL, ma presentano punti di forza diversi:
- GIN: generalmente più veloce nelle ricerche quando molti elementi contengono il termine cercato, e con tempi iniziali di creazione dell'indice più brevi.
- GiST: può essere più veloce negli aggiornamenti se i dati cambiano frequentemente, poiché GIN può essere più lento da aggiornare. GiST supporta inoltre un numero maggiore di operatori per FTS.
Per la maggior parte degli scenari FTS con molte operazioni di lettura, GIN è la scelta preferita.
Scegliere l'indice giusto
Ecco una guida rapida per aiutarla nella scelta:
- B-Tree: predefinito e di uso generale. Adatto a uguaglianze, intervalli e ordinamento.
- Hash: solo per uguaglianze esatte (
=), senza intervalli né ordinamento. Meno comune a causa delle sue limitazioni. - GIN: per dati "invertiti" come array, JSONB e ricerca full-text. Trova in modo efficiente gli elementi all'interno di tipi complessi.
- GiST: estremamente flessibile, per dati spaziali (punti, riquadri), tipi intervallo e talvolta ricerca full-text. Adatto agli operatori complessi.
Sfida: tipo di indice
Dispone di una tabella events con una colonna tags JSONB e cerca spesso gli eventi che contengono tag specifici utilizzando l'operatore @> (ad esempio WHERE tags @> '{"urgent"}').
Quale tipo di indice offrirebbe le migliori prestazioni per questo specifico schema di query?
Riepilogo: indici specializzati
Ottimo lavoro. Ha esplorato i tipi di indice avanzati di PostgreSQL:
- Indici Hash per verifiche rapide di uguaglianza, con alcune limitazioni.
- Indici GIN per interrogare in modo efficiente gli elementi contenuti in dati complessi come array e JSONB.
- Indici GiST per indicizzare in modo flessibile dati spaziali, tipi intervallo e operatori complessi.
Questi indici specializzati consentono di ottimizzare query che i B-Tree non riescono a gestire in modo efficiente. Nella prossima lezione analizzeremo gli indici parziali e gli indici su espressioni.
Impara SQL con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 22
- Lezioni
- 88
Domande Frequenti
La lezione «Indici Hash, GIN e GiST» è gratuita?
Sì — il testo completo di «Indici Hash, GIN e GiST» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso PostgreSQL Performance & Query Optimization, passa a CoddyKit PRO. Il corso PostgreSQL Performance & Query Optimization include 4 lezioni in totale.
Cosa imparerò in «Indici Hash, GIN e GiST»?
Comprenda i casi d'uso e i vantaggi degli indici hash, GIN e GiST per specifici tipi di dati e pattern di query. Eserciti PostgreSQL Performance & Query Optimization con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare PostgreSQL Performance & Query Optimization?
Non è richiesta alcuna esperienza precedente. PostgreSQL Performance & Query Optimization su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Indici Hash, GIN e GiST»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione PostgreSQL Performance & Query Optimization?
Sì. Ogni lezione PostgreSQL Performance & Query Optimization include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Indici Hash, GIN e GiST
- Indici parziali e su espressioni
- Indici covering e scansioni solo indice
- Indici BRIN per grandi quantità di dati sequenziali