⚡ Indexen & performance
Waarom queries traag worden en hoe je ze versnelt met indexen en slimme query-opbouw.
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.
Database leest elke rij één voor één tot de match gevonden is.
Database navigeert direct via de B-tree structuur naar de match.
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.
CREATE INDEX
-- 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;
-- 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);
Gebruik een herkenbaar prefix: idx_tabel_kolom. Zo kun je snel zien welke indexen er zijn en voor welke tabel/kolom ze bedoeld zijn.
EXPLAIN QUERY PLAN
Met EXPLAIN QUERY PLAN zie je hoe SQLite een query uitvoert — of het een index gebruikt of een volledige tabelscan doet.
-- 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_..."
In MySQL gebruik je EXPLAIN SELECT .... In PostgreSQL EXPLAIN ANALYZE SELECT ... voor nog meer details inclusief echte uitvoertijden.
Optimalisatietips
Indexen zijn één tool. Er zijn meer manieren om queries sneller te maken.
SELECT * FROM orders
-- Haalt alle kolommen opSELECT id, datum FROM orders
-- Alleen wat je nodig hebt-- Voorkom het laden van duizenden rijen tegelijk
SELECT * FROM logs ORDER BY datum DESC LIMIT 100;
WHERE LOWER(naam) = 'anna'WHERE naam = 'Anna'-- 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);
Oefening — indexen aanmaken
- Bekijk het query plan van
WHERE categorie = 'Elektronica'(zonder index) - Maak een index aan op
producten.categorie - Bekijk het plan opnieuw — ziet het er anders uit?
- Maak een index aan op
orders.gebruiker_iden test een JOIN-query
🧠 Kennischeck
Les 9 afgerond!
Je begrijpt nu hoe indexen werken en hoe je queries analyseert — essentieel voor productie-applicaties.