CodeGym /Corsi /SQL SELF /Tipi principali di indici: B-TREE, H...

Tipi principali di indici: B-TREE, HASH, GIN, GiST

SQL SELF
Livello 37 , Lezione 1
Disponibile

Allora, nel mondo di PostgreSQL ci sono diversi tipi di indici, e ognuno di loro è stato creato per svolgere un ruolo unico. È come scegliere un mezzo di trasporto: puoi usare la bici per una passeggiata al parco, ma se devi attraversare tutta la città probabilmente prendi la macchina. Allo stesso modo, indici diversi sono adatti a task diversi.

In PostgreSQL i tipi principali di indici sono:

  • B-TREE indici: indici universali per la maggior parte dei casi.
  • HASH indici: ottimizzati per confronti esatti.
  • GIN indici: perfetti per la ricerca su array e JSONB.
  • GiST indici: usati per tipi di dati complessi, tipo quelli geografici.

Gli indici sono fatti per velocizzare la ricerca delle righe. Hanno 4 tipi diversi di ottimizzazione: ogni tipo accelera certe operazioni e funziona meglio con certi tipi di dati.

Non puoi gestire direttamente gli indici. Tutto quello che puoi fare è scegliere il tipo di indice: nessuno o uno di quelli elencati sopra. Ora vediamo ognuno di loro per capire quando e come usarli.

Indici B-TREE

B-TREE (abbreviazione di "balanced tree") — è il tipo di indice più comune, la base del funzionamento di PostgreSQL. Questo indice crea una struttura ad albero dove i dati sono organizzati in modo da velocizzare ricerca, ordinamento e filtraggio.

Pensa a una biblioteca con scaffali, dove ogni scaffale ha libri messi in ordine alfabetico. Se cerchi un libro che inizia con la "M", non devi guardare tutti i libri uno per uno — basta partire dal mezzo. Gli alberi bilanciati funzionano più o meno così.

Quando usarli?

Praticamente sempre! Gli indici B-TREE sono super utili per:

  • Ricerca per intervallo: WHERE price > 100.
  • Ordinamento: ORDER BY name ASC.
  • Ricerca per uguaglianza: WHERE id = 42.

Ecco un esempio di creazione:

-- Creiamo un indice B-TREE per la colonna price della tabella products:
CREATE INDEX idx_price ON products(price);

Quando nella query scrivi qualcosa tipo WHERE price > 100, PostgreSQL userà questo indice e non dovrà scansionare tutta la tabella.

Indici HASH

Gli indici HASH usano hash table per trovare i dati al volo. Il loro punto forte è il confronto esatto dei valori. Però hanno un limite: gli indici HASH non supportano ricerca per intervallo o ordinamento.

È come un archivio dove ogni scheda ha un numero preciso. Cerchi la scheda numero 42 e il bibliotecario te la trova subito. Ma se chiedi: «fammi vedere le schede dal 40 al 50», ti dicono di no.

Gli indici HASH vanno bene solo per ricerche esatte:

  • WHERE email = 'user@example.com'.
  • SELECT ... WHERE id = 123.

Se ti servono intervalli o ordinamento, HASH non fa per te.

Esempio di creazione:

-- Creiamo un hash index per la colonna email della tabella users:
CREATE INDEX idx_email_hash ON users USING HASH (email);

Ora PostgreSQL userà questo indice per query tipo WHERE email = 'user@example.com'.

Nota bene: gli indici HASH sono per casi specifici e si usano meno spesso dei B-TREE.

Indici GIN (Generalized Inverted Index)

GIN — è un indice specializzato che fa vera magia con array, JSONB e dati testuali. Immagina di avere un armadio con migliaia di cassetti, e ogni cassetto ha un'etichetta. Per esempio, nel cassetto "mele" ci sono tutte le mele, in quello "banane" tutte le banane. Per trovare mele o banane non devi rovistare ovunque — vai dritto al cassetto giusto.

Gli indici GIN servono per:

  • Ricerca su array: @> (contiene), <@ (è contenuto).
  • Dati JSONB: WHERE jsonb_data @> '{"chiave": "valore"}'.

Esempio di creazione

-- Creiamo un indice GIN per la colonna tags che contiene array:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);

Ora PostgreSQL può trovare velocemente prodotti dove i tag sono, per esempio, "elettronica" e "consigliati".

Indici GiST (Generalized Search Tree)

Gli indici GiST sono uno strumento potente per lavorare con tipi di dati più complessi, inclusi coordinate geografiche e intervalli. Costruiscono alberi ottimizzati per ricerche spaziali e per intervallo.

Pensa a una mappa della città, dove ogni punto è segnato in base alle sue coordinate. Puoi trovare al volo tutti i punti nel raggio di 5 km da dove sei.

GiST è perfetto per:

  • Dati geografici: SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance).
  • Ricerca per intervallo: WHERE date_range && '[2023-01-01, 2023-12-31]'.

Esempio:

-- Creiamo un indice GiST per la colonna location che contiene dati geografici:
CREATE INDEX idx_location_gist ON places USING GiST (location);

Così puoi fare query geografiche complesse, tipo trovare i punti più vicini.

Tabella di confronto degli indici

Tipo di indice Adatto per... Esempi di utilizzo Note
B-TREE Ricerca per intervallo, ordinamento price > 100, ORDER BY name ASC Indice universale.
HASH Controllo esatto di uguaglianza email = 'user@example.com', id = 42 Non supporta intervalli.
GIN Array, JSONB tags @> '{tech}', jsonb_data @> '{"chiave": "valore"}' Più veloce per dati complessi.
GiST Geografia, intervalli, distanze ST_DWithin(geom, point, distance) Usato per geodati.

Ora conosci i tipi principali di indici in PostgreSQL e come usarli. Ricorda: la scelta dell’indice è una mossa strategica che decide la velocità delle tue query. Scacco matto ai rallentamenti!

2
Compito
SQL SELF, livello 37, lezione 1
Bloccato
Creazione di un indice `B-TREE` per velocizzare l’ordinamento dei dati
Creazione di un indice `B-TREE` per velocizzare l’ordinamento dei dati
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION