Salt la conținutul principal
Modulul 10 · Lecția 1 din 437/57 în curs~15 min
Lecții din modul (1/4)

Indici și B-Trees

Cum poate o bază de date să găsească o singură înregistrare între milioane de rânduri în fracțiuni de secundă?

În mod implicit, când întrebăm SELECT * FROM customers WHERE city = 'Milano', Postgres trebuie să efectueze o Scanare secvențială: citește fizic întregul tabel de pe disc rând cu rând, comparând fiecare oraș cu „Milano”. Când o masă deține milioane de înregistrări, acest proces paralizează performanța.

Principalul răspuns structural la aceste blocaje sunt Indici.

Indici (arbori B)

Indecșii funcționează exact ca indexul analitic din spatele unei cărți mari. În loc să citim întreaga carte pentru a găsi unde se vorbește despre „Milano”, căutăm paginile din spate unde cuvântul „Milano” ne redirecționează către [p. 45, 114, 230]. Bazele de date, în culise, construiesc această structură de date separată, foarte compactă (adesea un „B-Tree”) ordonate după coloana sau coloanele în cauză, conținând pointeri directe către stocarea fizică a rândurilor potrivite.

SQL
-- Creare un indice semplice
CREATE INDEX idx_customers_city ON customers(city);

Această singură operație declanșează motorul Postgres, care va extrage și indexa toate valorile city în fundal. Odată finalizat, fiecare SELECT ... WHERE city = '...' ulterioară va zbura!

Chei primare și unicitate

Știați că cheia primară (PRIMARY KEY) și regulile cheii UNIQUE folosesc în secret indici sub capotă? Deoarece DB trebuie să se asigure că un e-mail sau un ID nu este niciodată duplicat la inserarea sau modificarea rândurilor, PostgreSQL creează automat un index B-Tree implicit deasupra acestora: astfel verificările de unicitate durează microsecunde.

De aceea, aderările în câmpul ID sunt incredibil de performante.

Aruncarea unui index

Dacă vă dați seama că interogările grele s-au schimbat și un index nu este niciodată consultat, este înțelept să îl distrugeți și să recuperați spațiu vital:

SQL
DROP INDEX idx_customers_city;

Rândul tău

Exercițiu#sql.m10.l1.e1
Încercări: 0Se încarcă…

În e-commerce-ul nostru observăm prin tablouri de bord că de foarte multe ori filtrem clienții după naționalitate (coloana țară în clienți). \nCreați un nou index de bază pe coloana de țară și denumiți-l „idx_customers_country”.

Se încarcă editorul...
Afișează indiciu

Utilizați CREATE INDEX nume_index ON nume_tabel(nume_coloană);

Soluție disponibilă după 3 încercări

Explorarea indicilor unici secundari

Exercițiu#sql.m10.l1.e2
Încercări: 0Se încarcă…

Un index B-Tree poate fi, de asemenea, utilizat pentru a simula o constrângere UNIQUE la momentul creării și pentru a accelera căutările, în timp ce intenția logică este explicită și impusă.\n\nCreați un nou index în care declarați cuvântul cheie UNIQUE. Definiți-l astfel încât să blocheze orice înscrieri duplicate nedorite de la alți utilizatori, forțând unicitatea pe coloana „e-mail” a „clienților” și denumiți-o „idx_unique_email_customer”.

Se încarcă editorul...
Afișează indiciu

Scrieți CREATE UNIQUE INDEX nume_index ON tabel(coloană);

Soluție disponibilă după 3 încercări