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-TREEindici: indici universali per la maggior parte dei casi.HASHindici: ottimizzati per confronti esatti.GINindici: perfetti per la ricerca su array e JSONB.GiSTindici: 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!
GO TO FULL VERSION