Cum să creezi și să folosești indecși în baze de date — CREATE INDEX
In this tutorial, you'll learn about Cum să creezi și să folosești indecși în baze de date. We cover key concepts, practical examples, and best practices.
Cum să creezi și să folosești indecși în baze de date cu CREATE INDEX pentru a accelera interogările SQL și a reduce timpul de execuție al operațiilor de căutare și sortare.
Problema
Interogările SQL pe tabele mari devin lente când baza de date trebuie să scaneze fiecare rând (full table scan). Fără indecși, chiar și un simplu WHERE pe o coloană poate dura secunde pe tabele cu milioane de rânduri.
The Wrong Way
O interogare pe o coloană neindexată forțează un full table scan:
SELECT * FROM orders WHERE customer_email = 'ana@example.com';
Output (EXPLAIN ANALYZE):
Seq Scan on orders (cost=0.00..435.00 rows=1 width=200)
Filter: (customer_email = 'ana@example.com'::text)
Planning Time: 0.05 ms
Execution Time: 245.00 ms
Baza de date a scanat fiecare rând din tabel — 245ms pentru o singură căutare.
The Right Way
Creează un index pe coloana folosită în WHERE:
CREATE INDEX idx_orders_customer_email
ON orders (customer_email);
Acum aceeași interogare rulează mult mai rapid:
SELECT * FROM orders WHERE customer_email = 'ana@example.com';
Output (EXPLAIN ANALYZE):
Index Scan using idx_orders_customer_email on orders
(cost=0.28..8.29 rows=1 width=200)
Index Cond: (customer_email = 'ana@example.com'::text)
Execution Time: 0.35 ms
Timpul de execuție a scăzut de la 245ms la 0.35ms — de 700 de ori mai rapid.
Step-by-Step Fix
1. Identifică interogările lente
-- PostgreSQL: găsește interogările lente
SELECT query, calls, total_time / calls AS avg_time_ms
FROM pg_stat_statements
ORDER BY avg_time_ms DESC
LIMIT 10;
2. Creează indexul potrivit
Index simplu pe o coloană:
CREATE INDEX idx_orders_date ON orders (order_date);
Index compus pe mai multe coloane:
CREATE INDEX idx_orders_customer_date
ON orders (customer_email, order_date);
3. Verifică acoperirea (covering index)
Un index care conține toate coloanele interogării:
CREATE INDEX idx_orders_covering
ON orders (customer_email) INCLUDE (total, status);
4. Verifică utilizarea indexului
EXPLAIN ANALYZE
SELECT customer_email, total, status
FROM orders
WHERE customer_email = 'ana@example.com';
Prevention Tips
- Creează indecși pe coloanele folosite în WHERE, JOIN și ORDER BY
- Nu indexa excesiv — fiecare index încetinește INSERT/UPDATE/DELETE
- Folosește indecși compuși când filtrezi după mai multe coloane
- Monitorizează indexurile nefolosite cu instrumente de diagnostic
Greșeli comune cu indecși
- Index pe toate coloanele — degradează performanța scrierilor
- Indecși compuși în ordinea greșită — plasează coloana cu cea mai mare cardinalitate prima
- Fără indecși pe chei străine — JOIN-urile devin lente
- Index pe coloane cu puține valori unice — un index pe o coloană booleană este inutil
- Neactualizarea statisticilor — optimizerul ignoră indexul fără statistici fresh
Exercițiu practic
Creează un index compus pentru interogarea: SELECT * FROM products WHERE category = 'Electronics' AND price > 100 ORDER BY price;
Soluție:
CREATE INDEX idx_products_category_price
ON products (category, price);
FAQ
Construit de dezvoltătorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech se integrează nativ cu bazele de date pentru productivitate și securitate sporite.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro