Indici B-Tree e loro utilità
Che cosa memorizza realmente un indice e quali operazioni accelera.
Indici B-Tree e loro utilità è una lezione SQL Interview Prep 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 SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.
Perché gli intervistatori chiedono degli indici
Quando un intervistatore dice 'questa query è lenta, che cosa farebbe?', la risposta che si aspetta quasi sempre riguarda un indice. Gli indici sono la leva più importante per migliorare le prestazioni in lettura, quindi distinguono chi ha memorizzato la sintassi da chi comprende davvero come un database individua le righe.
In questa lezione costruirà un modello mentale preciso dell'indice B-Tree: cosa memorizza, quali operazioni accelera e come descriverlo nel modo in cui lo farebbe un senior engineer.
Il problema risolto da un indice
Senza un indice, trovare le righe che soddisfano una condizione obbliga il database a leggere ogni riga della tabella. Questa è una scansione sequenziale (o scansione completa della tabella). In una tabella da un milione di righe, ciò significa eseguire un milione di verifiche anche se corrisponde una sola riga.
Un indice è una struttura dati separata e ordinata che consente al motore di raggiungere direttamente le righe corrispondenti, proprio come l'indice di un libro permette di trovare un argomento senza leggere ogni pagina.
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';Cosa memorizza davvero un B-Tree
L'indice predefinito in PostgreSQL, MySQL, SQL Server e nella maggior parte dei motori è un B-Tree (albero bilanciato). Memorizza i valori della colonna indicizzata in ordine ordinato, organizzati in un albero poco profondo di pagine.
- Ogni nodo foglia contiene le chiavi dell'indice e un puntatore alla riga effettiva della tabella.
- L'albero rimane bilanciato, quindi ogni ricerca tocca solo poche pagine, indipendentemente dalle dimensioni della tabella.
Una ricerca percorre l'albero dalla radice fino a una foglia in circa log(N) passaggi, invece di analizzare tutte le N righe.
Creare il primo indice
Crei un indice B-Tree con CREATE INDEX. Gli assegni un nome chiaro, in modo che chi esamina il codice possa riconoscere immediatamente la tabella e le colonne.
Una volta creato questo indice, una query che applica un filtro su email può usarlo per trovare la riga corrispondente con poche letture di pagina, invece di eseguire una scansione completa.
CREATE INDEX idx_users_email ON users (email);
-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';Operazioni accelerate da un B-Tree
Poiché un B-Tree mantiene i valori in ordine ordinato, accelera molto più delle sole corrispondenze esatte. Gli intervistatori apprezzano quando le elenca con precisione:
- Uguaglianza:
WHERE email = ? - Intervalli:
WHERE age > 30,BETWEEN,<,>= - Corrispondenza per prefisso:
WHERE name LIKE 'Ada%'(ma NON'%da') - ORDER BY sulla colonna indicizzata, evitando un ordinamento separato
- MIN/MAX, poiché si trovano alle estremità della struttura ordinata
Esempio completo: query con intervallo
Consideri una tabella orders con milioni di righe. Una query di report deve recuperare gli ordini recenti. Con un indice su created_at, il motore raggiunge l'inizio dell'intervallo nell'indice ordinato e procede solo fino a dove è necessario.
L'indice trasforma una scansione dell'intera tabella in una scansione di un intervallo delimitato, leggendo soltanto la porzione che soddisfa il filtro.
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01';Gli indici aiutano anche nell'ordinamento
Un aspetto spesso trascurato: poiché l'indice è già ordinato, il motore può restituire le righe nell'ordine dell'indice e saltare un passaggio di ordinamento separato. Questo è importante per ORDER BY e soprattutto per la paginazione top-N.
Se ordina in base a una colonna che dispone di un indice corrispondente, l'ottimizzatore può leggere l'indice nell'ordine corretto e interrompersi appena ha recuperato un numero sufficiente di righe.
-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;Il costo nascosto: l'accesso all'heap
Un normale indice B-Tree memorizza solo la colonna indicizzata e un puntatore alla riga. Dopo aver trovato le voci corrispondenti, il motore deve quindi comunque raggiungere la tabella (l'heap) per leggere le altre colonne selezionate.
Questo secondo passaggio è l'accesso all'heap. È economico per poche righe, ma costoso quando una query ne restituisce molte; per questo a volte un indice con bassa selettività viene ignorato. (Vedrà più avanti come risolvere il problema con gli indici covering.)
Verificare che l'indice venga usato
Non affermi mai che un indice viene usato: lo dimostri con EXPLAIN. Durante un colloquio, descrivere il piano dimostra una comprensione reale.
Seq Scansignifica che l'indice NON è stato usato.Index ScanoIndex Seeksignifica che è stato usato.
Se ha aggiunto un indice ma continua a vedere una scansione sequenziale, il pianificatore ha giudicato la scansione più economica, spesso perché la query corrisponde a una frazione troppo grande della tabella.
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailLe chiavi primarie sono già indicizzate
Un trabocchetto comune nei colloqui: dichiarare una chiave PRIMARY KEY o un vincolo UNIQUE crea automaticamente un indice B-Tree di supporto. Non deve, e non dovrebbe, aggiungere un secondo indice sulla stessa colonna.
Per questo i join e le ricerche sulle chiavi primarie sono già veloci e la domanda «devo indicizzare la colonna id?» è solitamente un trabocchetto: è già stato fatto automaticamente.
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);Come esprimerlo durante il colloquio
Riunisca il concetto in una frase chiara a cui l'intervistatore possa annuire:
'Un indice B-Tree è una struttura ordinata e bilanciata che consente al motore di trovare le righe con letture di pagina pari a log(N), invece di scansionare l'intera tabella. Accelera le operazioni di uguaglianza, intervallo, prefisso e ORDER BY sulle colonne indicizzate, ma ogni corrispondenza richiede comunque un accesso all'heap per le colonne non indicizzate.'
Porti poi le prove con EXPLAIN. È la combinazione di modello ed evidenze a far ottenere punti.
Verifica rapida
Verifichi il suo modello mentale delle operazioni accelerate da un indice B-Tree.
Riepilogo: indici B-Tree
Concetti chiave da portare nella prossima lezione:
- Un B-Tree memorizza i valori indicizzati in modo ordinato all'interno di un albero bilanciato, offrendo ricerche in
log(N). - Accelera le operazioni di uguaglianza, intervallo, prefisso (LIKE iniziale), ORDER BY e MIN/MAX.
- Ogni corrispondenza richiede comunque un accesso all'heap per le colonne non presenti nell'indice.
- Racchiudere una colonna in una funzione o usare un carattere jolly iniziale disattiva l'indice.
- Verifichi sempre con
EXPLAIN; i vincoli PRIMARY KEY e UNIQUE creano automaticamente un indice.
Prossimo argomento: come ordinare le colonne quando un indice ne copre diverse contemporaneamente.
Domande Frequenti
La lezione «Indici B-Tree e loro utilità» è gratuita?
Sì — il testo completo di «Indici B-Tree e loro utilità» è 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 SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Indici B-Tree e loro utilità»?
Che cosa memorizza realmente un indice e quali operazioni accelera. Eserciti SQL Interview Prep 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 SQL Interview Prep?
Non è richiesta alcuna esperienza precedente. SQL Interview Prep 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 B-Tree e loro utilità»?
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 SQL Interview Prep?
Sì. Ogni lezione SQL Interview Prep 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 B-Tree e loro utilità
- Ordine delle colonne negli indici compositi
- Indici covering e scansioni index-only
- Quando gli indici sono dannosi: scritture e selettività