SQL-trackLes 9 van 10

⚡ Indexen & performance

Waarom queries traag worden en hoe je ze versnelt met indexen en slimme query-opbouw.

⏱ 25 min6 stappenInteractieve SQL-sandbox
Stap 1 / 6

Wat is een index?

Stel je hebt een tabel met 1 miljoen gebruikers. Als je zoekt op e-mailadres, moet de database zonder index alle 1 miljoen rijen doorlopen. Met een index werkt het als een alfabetisch register — direct naar de juiste pagina.

🐌 Zonder index — Full Table Scan

Database leest elke rij één voor één tot de match gevonden is.

1.000.000 rijen × 0.001ms = 1000ms
⚡ Met index — Index Seek

Database navigeert direct via de B-tree structuur naar de match.

log₂(1.000.000) ≈ 20 stappen = <1ms
Wat wordt automatisch geïndexeerd?
PRIMARY KEY — altijd een index
UNIQUE — altijd een index
Overige kolommen — handmatig aanmaken
Trade-off — indexen kosten ook wat

Indexen versnellen SELECT, maar vertragen INSERT/UPDATE/DELETE (de index moet bijgehouden worden). En ze nemen schijfruimte in. Voeg alleen indexen toe op kolommen die je vaak filtert of sorteert.

Stap 2 / 6

CREATE INDEX

Syntaxis
-- Enkelvoudige index
CREATE INDEX idx_naam ON tabel (kolom);

-- Samengestelde index (meerdere kolommen)
CREATE INDEX idx_naam ON tabel (kolom1, kolom2);

-- Unieke index (dubbele waarden verbieden)
CREATE UNIQUE INDEX idx_email ON gebruikers (email);

-- Index verwijderen
DROP INDEX idx_naam;
Praktijkvoorbeelden — wanneer een index?
-- Veel zoekopdrachten op e-mail → index op email
CREATE INDEX idx_gebruikers_email ON gebruikers (email);

-- Bestellingen ophalen per gebruiker → index op foreign key
CREATE INDEX idx_orders_gebruiker ON orders (gebruiker_id);

-- Producten filteren op categorie + sorteren op prijs
CREATE INDEX idx_producten_cat_prijs ON producten (categorie, prijs);
Naamconventie voor indexen

Gebruik een herkenbaar prefix: idx_tabel_kolom. Zo kun je snel zien welke indexen er zijn en voor welke tabel/kolom ze bedoeld zijn.

Stap 3 / 6

EXPLAIN QUERY PLAN

Met EXPLAIN QUERY PLAN zie je hoe SQLite een query uitvoert — of het een index gebruikt of een volledige tabelscan doet.

Gebruik in de sandbox
-- Bekijk het uitvoeringsplan van een query
EXPLAIN QUERY PLAN
SELECT * FROM gebruikers WHERE email = 'anna@email.nl';

-- Zonder index: "SCAN gebruikers" (= trage volledige scan)
-- Met index:    "SEARCH gebruikers USING INDEX idx_..."
Wat je zoekt in het plan
SEARCH ... USING INDEX Goed — database gebruikt een index
SCAN tabel Mogelijk traag — volledige tabelscan, overweeg een index
SEARCH ... USING COVERING INDEX Optimaal — alle gevraagde data zit al in de index
MySQL/PostgreSQL equivalent

In MySQL gebruik je EXPLAIN SELECT .... In PostgreSQL EXPLAIN ANALYZE SELECT ... voor nog meer details inclusief echte uitvoertijden.

Stap 4 / 6

Optimalisatietips

Indexen zijn één tool. Er zijn meer manieren om queries sneller te maken.

1. SELECT alleen wat je nodig hebt
❌ Traag
SELECT * FROM orders
-- Haalt alle kolommen op
✅ Sneller
SELECT id, datum FROM orders
-- Alleen wat je nodig hebt
2. Gebruik LIMIT bij grote tabellen
-- Voorkom het laden van duizenden rijen tegelijk
SELECT * FROM logs ORDER BY datum DESC LIMIT 100;
3. Vermijd functies op geïndexeerde kolommen in WHERE
❌ Index wordt niet gebruikt
WHERE LOWER(naam) = 'anna'
✅ Index werkt wel
WHERE naam = 'Anna'
4. Foreign keys altijd indexeren
-- Bij elke JOIN wordt de foreign key gebruikt als zoeksleutel
CREATE INDEX idx_orders_gebruiker_id ON orders (gebruiker_id);
CREATE INDEX idx_orders_product_id   ON orders (product_id);
Stap 5 / 6

Oefening — indexen aanmaken

🎯 Opdrachten
  1. Bekijk het query plan van WHERE categorie = 'Elektronica' (zonder index)
  2. Maak een index aan op producten.categorie
  3. Bekijk het plan opnieuw — ziet het er anders uit?
  4. Maak een index aan op orders.gebruiker_id en test een JOIN-query
Resultaat verschijnt hier...

🧠 Kennischeck

Les 9 afgerond!

Je begrijpt nu hoe indexen werken en hoe je queries analyseert — essentieel voor productie-applicaties.

Les 10: SQL in de praktijk →