Wat is Index (databaseindex)?

Datastructuur in een database om op basis van een waarde in een bepaalde kolom van een tabel snel de plaats te vinden van de rijen met die waarde. Vaak worden B+-bomen gebruikt. Ze maakt zoekopdrachten sneller, maar moet bij elke toevoeging, wijziging of verwijdering van een rij worden bijgehouden en neemt opslagruimte in.

Japanse benaming: インデックス

“Index (databaseindex)” komt voor in 4 oefenvragen uit 1 onderwerpen, bijv. Basis van databases.

Vakgebied: Basis van databases

Hoe een B+-boomindex werkt

Indexen van relationele databases gebruiken vaak B+-bomen. Een B+-boom is een boomstructuur met veel takken per knoop en hetzelfde aantal niveaus van de wortel naar elk blad; de bladeren bevatten kolomwaarden en de plaatsen van rijen in volgorde van de waarden en zijn achter elkaar aan elkaar gekoppeld. Als elke knoop zich in 100 takken splitst, kunnen drie niveaus 1 miljoen items onderscheiden, dus zelfs in een tabel van 1 miljoen rijen wordt de gezochte rij in enkele leesacties bereikt. Omdat de bladeren in volgorde van de waarden zijn gekoppeld, kan de index niet alleen worden gebruikt voor zoekopdrachten met =, maar ook voor zoekopdrachten op een bereik, zoals BETWEEN, en voor sorteren met ORDER BY.

Wanneer een index helpt en wanneer niet

Een index is effectief op een zeer selectieve kolom, waarbij een voorwaarde de rijen beperkt tot een klein deel van het geheel. Een kolom waarvan alle waarden verschillend zijn, zoals een lidnummer, is ideaal, maar bij een kolom met slechts twee waarden, zoals geslacht, voldoet ongeveer de helft van de rijen, en dan is een full table scan die de tabel in volgorde leest vaak sneller dan rijen een voor een via de index ophalen. Een gewone index is soms ook onbruikbaar voor voorwaarden die een functie op de kolom toepassen of voor overeenkomsten op het einde, zoals LIKE '%sen'.

De prijs bij het schrijven

Een index is een datastructuur die los van de tabel wordt bijgehouden. Telkens wanneer een rij wordt toegevoegd, gewijzigd of verwijderd, moeten ook alle betrokken indexen worden bijgewerkt, dus hoe meer indexen er zijn, hoe trager het schrijven en hoe meer opslag er wordt gebruikt. De basisaanpak is daarom indexen aan te maken op kolommen die vaak als zoek- of joinvoorwaarde worden gebruikt, en ongebruikte indexen te verwijderen. Veel DBMS'en maken automatisch een index aan op kolommen met een primaire sleutel of een beperking UNIQUE.

Nu oefenen: vragen over Index (databaseindex)

Op de kolom LidNr van de tabel Lid met 1 miljoen rijen is een index in de vorm van een B+-boom aangemaakt. Welke combinatie van het effect dat in het algemeen mag worden verwacht en de prijs daarvoor is juist?

  1. AZoekopdrachten zoals WHERE LidNr = 12345 worden sneller, maar schrijven wordt trager omdat de index ook moet worden bijgewerkt telkens wanneer een rij wordt toegevoegd of gewijzigd
  2. BZoekopdrachten op alle kolommen worden sneller, zonder enige prijs
  3. CDe rijen van de tabel worden op LidNr gesorteerd, zodat elke zoekopdracht sneller wordt, en de benodigde opslag wordt gehalveerd
Antwoord en toelichting tonen

Antwoord: A. Zoekopdrachten zoals WHERE LidNr = 12345 worden sneller, maar schrijven wordt trager omdat de index ook moet worden bijgewerkt telkens wanneer een rij wordt toegevoegd of gewijzigd

Een index is een datastructuur om op basis van een waarde in een bepaalde kolom snel de plaats te vinden van de rijen met die waarde; relationele databases gebruiken vaak B+-bomen. Zonder index moeten voor de rij WHERE LidNr = 12345 de 1 miljoen rijen een voor een worden doorzocht (een full table scan), maar met een B+-boom wordt de rij gevonden door slechts enkele niveaus van de wortel naar een blad te volgen. Als elke knoop zich bijvoorbeeld in 100 takken splitst, is 100 × 100 × 100 = 1 miljoen, dus ongeveer drie niveaus zijn genoeg. Omdat de bladeren van een B+-boom in volgorde van de waarden aan elkaar zijn gekoppeld, kan de index ook worden gebruikt voor zoekopdrachten op een bereik, zoals BETWEEN, en voor sorteren met ORDER BY. Aan de andere kant moet de index worden bijgewerkt telkens wanneer een rij wordt toegevoegd, gewijzigd of verwijderd, dus schrijven wordt trager, en de index vraagt opslagruimte. Zoekopdrachten op kolommen zonder index worden niet sneller.

Voor de tabel Lid met 1 miljoen rijen wordt overwogen op elk van de kolommen LidNr (allemaal verschillend), Prefectuur (47 waarden) en Geslacht (2 waarden, ruwweg half om half) een B+-boomindex aan te maken. Op welke kolom is een index waarschijnlijk het minst effectief bij een zoekopdracht waarin in de WHERE-clausule een waarde voor één kolom wordt opgegeven?

  1. APrefectuur
  2. BGeslacht
  3. CLidNr
Antwoord en toelichting tonen

Antwoord: B. Geslacht

Een index is effectief als de rijen die aan de voorwaarde voldoen worden beperkt tot een klein deel van het geheel. Elk LidNr is verschillend, dus slechts één rij voldoet en de index leidt er rechtstreeks naartoe. Prefectuur heeft 47 waarden, dus als de leden gelijkmatig verdeeld zijn, beperkt één waarde de zoekopdracht tot ongeveer 1 miljoen ÷ 47 ≈ 21.000 rijen (ongeveer 2% van het totaal). Geslacht heeft twee waarden die ruwweg half om half verdeeld zijn, dus elk van beide waarden levert ongeveer 500.000 rijen op (ongeveer 50%). Zoveel rijen een voor een via een index ophalen is vaak trager dan een full table scan die de tabel van begin tot eind leest, dus de optimizer van het DBMS kan een uitvoeringsplan kiezen dat de index niet gebruikt. Zo geldt: hoe meer verschillende waarden een kolom heeft en hoe sterker een voorwaarde erop de rijen beperkt (hoe selectiever ze is), hoe effectiever een index op die kolom is.

Veelgestelde vragen

Moet er op elke kolom een index worden aangemaakt?

Nee. Hoe meer indexen er zijn, hoe meer onderhoud er bij elke toevoeging of wijziging van een rij nodig is en hoe meer opslag er wordt gebruikt. Maak indexen aan op kolommen die vaak als zoek- of joinvoorwaarde worden gebruikt en de rijen voldoende beperken.

Waarom wordt een index niet gebruikt, ook al is hij aangemaakt?

Mogelijke redenen zijn dat de optimizer oordeelt dat er zoveel rijen voldoen dat een full table scan sneller is, of een voorwaarde die de volgorde van de index niet kan benutten, zoals een voorwaarde die een functie op de kolom toepast of een LIKE met een overeenkomst op het einde.

“Index (databaseindex)” in de toelichting

Vragen met “Index (databaseindex)” (4)

  1. Op de kolom LidNr van de tabel Lid met 1 miljoen rijen is een index in de vorm van een B+-boom aangemaakt. Welke combinatie van het effect dat in het algemeen mag worden verwacht en de prijs daarvoor is juist?
  2. Voor de tabel Lid met 1 miljoen rijen wordt overwogen op elk van de kolommen LidNr (allemaal verschillend), Prefectuur (47 waarden) en Geslacht (2 waarden, ruwweg half om half) een B+-boomindex aan te maken. Op welke kolom is een index waarschijnlijk het minst effectief bij een zoekopdracht waarin in de WHERE-clausule een waarde voor één kolom wordt opgegeven?
  3. SQL-statements worden ingedeeld in de datadefinitietaal (DDL), de datamanipulatietaal (DML) en de datacontroletaal (DCL). Welke wordt als DDL ingedeeld?
  4. Welke beschrijving van een view in een relationele database is juist?

Verwante termen

Relationele database View (databaseview) SQL Transactie ACID-eigenschappen Derde normaalvorm (3NF) ER-diagram (entity-relationshipdiagram) Isolatieniveau Normalisatie NoSQL

Naar de woordenlijst