Data i en MySQL/MariaDB-database er gemt i tabeller. En simpel måde at tænke indeks på er at forestille sig et omfattende regneark. Denne type system er ikke altid befordrende for hurtig søgning; det er her et indeks bliver essentielt. Hvis der ikke er noget indeks, skal databasemotoren starte ved række et og gennemse alle rækkerne og lede efter de tilsvarende værdier. Hvis dette er en lille tabel, så er det ikke nogen stor sag, men i større tabeller og applikationer, hvor der kan være tabeller med millioner og endda milliarder af rækker, bliver det problematisk. Som du kan forestille dig, vil det være tidskrævende at søge gennem disse rækker én efter én, selv på den nyeste hardware. Løsningen er at oprette et INDEX (eller mere end et) for dine data.
Hvad er et indeks?
Et indeks er en organiseret opslagstabel, der indeholder pointere til, hvor data kan hentes i databasen. Dette koncept ligner bogindekser. I en bog oplister indekset sidetal, hvor forskellige emner er placeret. I en database gemmer indekset pointere, der er i en logisk og sorteret rækkefølge, hvilket tillader hurtige opslag i databasen. Forestil dig en bog uden indeks. Hvis du vil slå information op om et bestemt emne, skal du starte fra begyndelsen og bladre igennem siderne, indtil du finder den information, du leder efter. Et bogregister løser dette ved at fortælle dig præcis, hvilke sider informationen du leder efter er. Dette er i bund og grund, hvordan et MySQL-indeks fungerer.
Hvornår bruger MySQL indekser?
Når som helst databaseserveren skal slå information op, vil den bruge et indeks til at fremskynde processen. Eksempler på dette omfatter WHERE, JOIN ON, MIN/MAX og ORDER BY/GROUP BY-klausuler. Hvis dine forespørgsler ofte skal søge eller matche en kolonne i nogen af disse situationer, bør du overveje at oprette et indeks.
Forbedrer indekser databasens ydeevne?
Det meste af tiden er det korte svar ja. For læsninger og søgninger gennem dataene øger indekser absolut ydeevnen. Hvis du ikke laver fuld tabelscanninger, forbedres stort set enhver SELECT-forespørgsel. Dette kommer til en lille pris. For kolonner, der ofte manipuleres, er der en omkostning for hver ændring. Dette kan fordybe INSERTs og UPDATEs på databasen.
Almindelige MySQL-indekstyper
Der er tre almindelige typer af MySQL-indekser:
- Primær nøgle
- Indeks
- Unik
PRIMÆR NØGLE
En primær nøgle fortæller databaseserveren, hvilken eller hvilke kolonner der er mest afgørende i tabellen. Typisk bruges dette til auto_increment id-kolonner. For eksempel, hvis du har en tabel, der indeholder medarbejderoplysninger, vil du gerne have en primær nøgle i kolonnen "EMPLOYEE_ID". I andre tabeller, dvs. en løntabel, vil du blot henvise til EMPLOYEE_ID i stedet for alle medarbejderens data.
INDEKS
Et standard INDEX bruges til at fortælle databaseserveren, at en eller flere af kolonnerne i tabellen vil blive søgt en hel del, og derfor bør der oprettes et indeks på dem. Dette kan bygges under oprettelsen af tabellen, eller hvis du finder ud af, at du har brug for et indeks på en kolonne senere, kan det tilføjes derefter.
UNIKK
Et UNIKT indeks er en smule distinkt ved, at det sætter specifikke begrænsninger på, hvad der kan skrives ind i tabellen. Hvis du forsøger at indsætte en række, der indeholder en værdi, der allerede er inkluderet i dataene, vil INSERT give en fejl. Dette giver mulighed for hurtige søgninger samt en vis dataintegritet.
Sådan opretter du et indeks
Der er flere måder at oprette et indeks på en kolonne. Du kan opsætte et indeks, når du CREATE TABLE, eller bagefter med enten ALTER TABLE eller CREATE INDEX sætningerne.
Oprettelse af et PRIMÆR NØGLEindeks
Den nemmeste måde at oprette et PRIMARY KEY-indeks på er at gøre det, når du opretter tabellen. Vi vil bruge et eksempel på en medarbejdertabel til denne øvelse. Tabellen vil have tre kolonner:ID, FIRSTNAME og LASTNAME. Oprettelsen kan se sådan ud:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32)
);
Denne erklæring vil oprette tabellen uden et indeks. Vi kan tilføje den primære nøgle med en sætning som denne:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT PRIMARY KEY (ID);
Dette fortæller MySQL, at vi har en primær nøgle på kolonne-id'et.
En mere ligetil måde at gøre dette på er under oprettelsen af bordet. Startende forfra vil vi genskabe tabellen og tilføje den primære nøgle i én sætning.
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Denne enkelte erklæring udfører de samme opgaver som de to første sætninger ovenfor. En primærnøgle kan indeholde mere end én kolonne, men kolonnerne skal alle være unikke. Den primære nøgle kan bruges til at identificere enhver individuel række i tabellen.
Oprettelse af et indeks ved hjælp af CREATE INDEX
Ved hjælp af eksempeltabellen ovenfor, forestil dig, at virksomheden har tusindvis af ansatte, og du ønsker at kunne søge medarbejderne hurtigt på efternavn. Med en primær nøgle kan der kun være én indtastning. Du kan ikke have flere personer, der har det samme medarbejder-id. Med efternavne er det ret almindeligt, at flere personer deler det navn. Igen er der et par måder at gøre dette på. Ved at bruge tabellen ovenfor:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Vi kan tilføje et indeks til kolonnen LASTNAME på denne måde:
CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);
Søgninger efter LASTNAME vil nu være hurtigere på denne tabel. I dette eksempel er "idx1" navnet på indekset. Dette vil gøre det lettere at referere til selve indekset i fremtiden, hvis vi har brug for det.
En anden måde at tilføje et indeks til en tabel på er med kommandoen ALTER TABLE. For at opnå det samme, som vi gjorde med den forrige sætning, ville vi køre følgende kommando:
ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);
Den sidste måde at tilføje et indeks, der ville spare noget tid, er at gøre det under OPRET TABEL. Hvis du på forhånd ved, at du vil søge eller deltage i en bestemt kolonne, kan du oprette den indledende tabel med indekset der allerede:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx1 (LASTNAME)
);
Alle disse tre udsagn skaber det samme resultat.
Indekser med flere kolonner
Et indeks behøver ikke kun at være på en enkelt kolonne. Hvis vi ønsker hurtigere opslag på både FIRSTNAME og LASTNAME, kan vi oprette et indeks på begge kolonner. I tabellen oprette ville det se sådan ud:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx2 (LASTNAME,FIRSTNAME)
);
Brug af CREATE INDEX kommandoen:
CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);
Og til sidst, kommandoen ALTER TABLE:
ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);
Oprettelse af ET UNIKT INDEKS
Der kan være tidspunkter, hvor du gerne vil oprette et indeks på en kolonne og også tvinge alle poster i den kolonne til at være unikke. Hvis vi udvidede vores eksempeltabel til at inkludere en KONTOR-kolonne (der angiver hvilket kontor i bygningen de har), så vil vi måske gøre dette til et UNIKT indeks. Lad os arbejde med denne tabel:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
OFFICE INT,
PRIMARY KEY (ID)
);
Bemærk, at nu har vi et heltal gemt i tabellen for at angive, hvilket embede personen besætter. Dette kan referere til en anden tabel, "KONTORER", som vil indeholde oplysninger om forskellige kontorer i bygningen.
For at oprette et indeks over dette, vil vi udstede følgende kommando:
CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);
Du kan bruge lignende kommandoer til at oprette disse i kommandoerne CREATE TABLE og ALTER TABLE. Hvis du nu prøvede at køre disse to indsættelser:
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);
Du vil modtage en fejl på den anden INSERT:
Duplicate entry '1' for key 'idx3'
Fjernelse af et indeks
Der kan komme et tidspunkt, hvor du ikke længere ønsker et indeks på en kolonne. Måske indså du, at du ikke søger i en kolonne så tit, og indekset forsinker indsættelser og opdateringer. For at gøre dette bruger vi kommandoen DROP INDEX. Vores bord blev lavet sådan her:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR,
LASTNAME CHAR,
PRIMARY KEY (ID),
INDEX idx (LASTNAME,FIRSTNAME)
);
Hvis vi ønsker at fjerne indekset på kolonnerne LASTNAME og FIRSTNAME, vil vi udstede denne kommando:
DROP INDEX IDX ON EMPLOYEE;
Konklusion
Databaseindekser er et grundlæggende værktøj, der optimerer hastigheden af datahentning i en struktur, der udnytter søge- og læseydelsen i en tabel. Indeksforbedring er primært drevet på bekostning af mere skrive- og/eller lagerplads for at opretholde en optimal indeksdatastruktur.
MySQL- og MariaDB-databaser tilbyder flere andre søgninger og læsemuligheder, inklusive mange, der ikke var dækket her. De vigtigste ting her inkluderer:
- Sørg for, at du tager dig tid til at planlægge dine borde på forhånd.
- Hvis du ikke planlægger forud, når du opretter tabellerne, skal du evaluere de kolonner, der søges mest efter, og oprette et indeks for dem.
Se det i aktion!
Vores brede linje af dedikerede servere giver den kraft, stabilitet og sikkerhed, der er nødvendig for at være vært for den mindste database til voksende virksomheder op til en højtilgængelig, klynget serveropsætning for de største virksomheder. Vil du se, hvilke løsninger vi kan tilbyde for at opfylde dine behov?
Ring til os på 800.580.4985, eller åben en chat eller billet med os for at tale med en af vores kyndige løsninger eller erfarne hostingrådgivere for at lære, hvordan du kan drage fordel af denne teknologi i dag!