Gegevens in een MySQL/MariaDB-database worden opgeslagen in tabellen. Een simpele manier om over indexen na te denken is om je een uitgebreide spreadsheet voor te stellen. Dit type systeem is niet altijd bevorderlijk voor snel zoeken; dat is waar een index essentieel wordt. Als er geen index is, moet de database-engine bij rij één beginnen en door alle rijen bladeren op zoek naar de bijbehorende waarden. Als dit een kleine tabel is, is dat geen probleem, maar in grotere tabellen en toepassingen waar er tabellen kunnen zijn met miljoenen en zelfs miljarden rijen, wordt het problematisch. Zoals u zich kunt voorstellen, zal het een voor een doorzoeken van die rijen tijdrovend zijn, zelfs op de nieuwste hardware. De oplossing is om een INDEX (of meer dan één) voor uw gegevens te maken.
Wat is een index?
Een index is een georganiseerde opzoektabel die verwijzingen bevat naar waar gegevens in de database kunnen worden opgehaald. Dit concept is vergelijkbaar met boekindexen. In een boek vermeldt de index paginanummers waar verschillende onderwerpen zich bevinden. In een database slaat de index pointers op die in een logische en gesorteerde volgorde staan, waardoor snel opzoeken in de database mogelijk is. Stel je een boek voor zonder index. Als u informatie over een specifiek onderwerp wilt opzoeken, moet u bij het begin beginnen en door de pagina's bladeren totdat u de informatie vindt die u zoekt. Een boekenindex lost dit op door u precies te vertellen op welke pagina's de informatie u zoekt. Dit is in wezen hoe een MySQL-index werkt.
Wanneer gebruikt MySQL indexen?
Telkens wanneer de databaseserver informatie moet opzoeken, zal deze een index gebruiken om het proces te versnellen. Voorbeelden hiervan zijn de clausules WHERE, JOIN ON, MIN/MAX en ORDER BY/GROUP BY. Als uw zoekopdrachten in een van deze situaties vaak zoeken naar of overeenkomen met een kolom, kunt u overwegen een index te maken.
Verbeteren indexen de databaseprestaties?
Meestal is het korte antwoord ja. Voor het lezen en doorzoeken van de gegevens verhogen indexen absoluut de prestaties. Het niet uitvoeren van volledige tabelscans zal zowat elke SELECT-query verbeteren. Dit komt tegen een kleine prijs. Voor kolommen die vaak worden gemanipuleerd, zijn er kosten voor elke wijziging. Dit kan INSERT's en UPDATE's in de database doen vastlopen.
Veelvoorkomende MySQL-indextypen
Er zijn drie veelvoorkomende typen MySQL-indexen:
- Primaire sleutel
- Index
- Uniek
PRIMAIRE SLEUTEL
Een primaire sleutel vertelt de databaseserver welke de meest cruciale kolom(men) in de tabel is. Meestal wordt dit gebruikt voor auto_increment id-kolommen. Als u bijvoorbeeld een tabel heeft die werknemersinformatie bevat, wilt u een primaire sleutel in de kolom "WERKNEMER_ID". In andere tabellen, d.w.z. een salaristabel, zou u gewoon verwijzen naar de EMPLOYEE_ID in plaats van alle gegevens van de werknemer.
INDEX
Een standaard INDEX wordt gebruikt om de databaseserver te vertellen dat een of meer van de kolommen in de tabel veel zullen worden doorzocht, en dat er dus een index op moet worden gemaakt. Dit kan worden gebouwd tijdens het maken van de tabel of als u later een index op een kolom nodig vindt, kan deze dan worden toegevoegd.
UNIEK
Een UNIEKE index is een beetje anders omdat het specifieke beperkingen oplegt aan wat in de tabel kan worden geschreven. Als u een rij probeert in te voegen die een waarde bevat die al in de gegevens is opgenomen, zal de INSERT een fout produceren. Dit zorgt voor snelle zoekopdrachten en enige gegevensintegriteit.
Hoe maak je een index
Er zijn meerdere manieren om een index op een kolom te maken. U kunt een index instellen wanneer u CREATE TABLE maakt, of daarna met de instructies ALTER TABLE of CREATE INDEX.
Een PRIMARY KEY-index maken
De eenvoudigste manier om een PRIMARY KEY-index te maken, is door dit te doen wanneer u de tabel maakt. Voor deze tutorial gebruiken we een voorbeeld van een werknemerstabel. De tabel heeft drie kolommen:ID, FIRSTNAME en LASTNAME. De aanmaak kan er ongeveer zo uitzien:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32)
);
Met deze instructie wordt de tabel zonder index gemaakt. We kunnen de primaire sleutel toevoegen met een instructie als deze:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT PRIMARY KEY (ID);
Dit vertelt MySQL dat we een primaire sleutel op de kolom-ID hebben.
Een eenvoudigere manier om dit te doen, is tijdens het maken van de tabel. Als we opnieuw beginnen, maken we de tabel opnieuw en voegen we de primaire sleutel in één instructie toe.
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Deze enkele instructie voert dezelfde taken uit als de eerste twee bovenstaande instructies. Een primaire sleutel kan meer dan één kolom bevatten, maar de kolommen moeten allemaal uniek zijn. De primaire sleutel kan worden gebruikt om elke afzonderlijke rij in de tabel te identificeren.
Een index maken met CREATE INDEX
Stel u met behulp van de bovenstaande voorbeeldtabel voor dat het bedrijf duizenden werknemers heeft en dat u de werknemers snel op achternaam wilt kunnen zoeken. Met een primaire sleutel kan er maar één invoer zijn. U kunt niet meerdere mensen hebben met dezelfde werknemers-ID. Bij achternamen is het vrij gebruikelijk dat meerdere mensen die naam delen. Nogmaals, er zijn een paar manieren om dit te doen. Met behulp van de bovenstaande tabel:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
We kunnen een index toevoegen aan de kolom LASTNAME als volgt:
CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);
Zoeken op LASTNAME gaat nu sneller in deze tabel. In dit voorbeeld is "idx1" de naam van de index. Dit maakt het gemakkelijker om in de toekomst naar de index zelf te verwijzen als dat nodig is.
Een andere manier om een index aan een tabel toe te voegen is met het ALTER TABLE commando. Om hetzelfde te bereiken als we deden met de vorige instructie, zouden we het volgende commando uitvoeren:
ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);
De laatste manier om een index toe te voegen die wat tijd zou besparen, is door dit te doen tijdens de CREATE TABLE. Als je van tevoren weet dat je gaat zoeken of deelnemen aan een specifieke kolom, dan kun je de eerste tabel maken met de index die er al is:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx1 (LASTNAME)
);
Alle drie deze uitspraken geven hetzelfde resultaat.
Indexen met meerdere kolommen
Een index hoeft niet alleen op één kolom te staan. Als we snellere zoekacties willen op zowel FIRSTNAME als LASTNAME, kunnen we een index maken op beide kolommen. In de tabel Create ziet het er als volgt uit:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx2 (LASTNAME,FIRSTNAME)
);
Het CREATE INDEX commando gebruiken:
CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);
En tot slot, het ALTER TABLE commando:
ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);
Een UNIEKE INDEX maken
Er kunnen momenten zijn dat u een index voor een kolom wilt maken en ook wilt dat alle vermeldingen in die kolom uniek zijn. Als we onze voorbeeldtabel hebben uitgebreid met een KANTOOR-kolom (die aangeeft welk kantoor in het gebouw ze hebben), dan willen we hier misschien een UNIEKE index van maken. Laten we met deze tabel werken:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
OFFICE INT,
PRIMARY KEY (ID)
);
Merk op dat we nu een geheel getal hebben opgeslagen in de tabel om aan te geven welk ambt de persoon bekleedt. Dit kan verwijzen naar een andere tabel, “KANTOREN”, die informatie zal bevatten over verschillende kantoren in het gebouw.
Om hier een index op te maken, zouden we het volgende commando geven:
CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);
U kunt vergelijkbare opdrachten gebruiken om deze te maken in de opdrachten CREATE TABLE en ALTER TABLE. Als u nu deze twee invoegingen probeert uit te voeren:
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);
U krijgt een foutmelding bij de tweede INSERT:
Duplicate entry '1' for key 'idx3'
Een index verwijderen
Er kan een moment komen dat u geen index meer op een kolom wilt. Misschien realiseerde je je dat je niet zo vaak een kolom doorzoekt, en de index vertraagt invoegingen en updates. Om dit te doen, gebruiken we de opdracht DROP INDEX. Onze tabel is als volgt gemaakt:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR,
LASTNAME CHAR,
PRIMARY KEY (ID),
INDEX idx (LASTNAME,FIRSTNAME)
);
Als we de index op de kolommen LASTNAME en FIRSTNAME willen verwijderen, geven we dit commando:
DROP INDEX IDX ON EMPLOYEE;
Conclusie
Database-indexen zijn een fundamenteel hulpmiddel dat de snelheid van het ophalen van gegevens optimaliseert binnen een structuur die profiteert van zoek- en leesprestaties in een tabel. Indexverbetering gaat voornamelijk ten koste van meer schrijf- en/of opslagruimte om een optimale indexgegevensstructuur te behouden.
MySQL- en MariaDB-databases bieden meerdere andere zoek- en leesopties, waaronder vele die hier niet zijn behandeld. Belangrijke afhaalrestaurants hier zijn:
- Zorg ervoor dat u de tijd neemt om uw tafels van tevoren te plannen.
- Als u niet vooruit plant bij het maken van tabellen, evalueer dan de kolommen die het meest worden doorzocht en maak er een index voor aan.
Zie het in actie!
Onze brede reeks dedicated servers biedt de kracht, stabiliteit en beveiliging die nodig zijn om de kleinste database voor groeiende bedrijven te hosten tot een high-available, geclusterde serverconfiguratie voor de grootste bedrijven. Wilt u zien welke oplossingen we kunnen bieden om aan uw behoeften te voldoen?
Bel ons op 800.580.4985, of open een chat of ticket met ons om met een van onze deskundige oplossingen of ervaren hostingadviseurs te spreken om te leren hoe u vandaag nog van deze technologie kunt profiteren!