Optimér søgehastigheden i MySQL

 

En artikel om indeksering i MySQL


Hvad er et index?
Et index er en organiseret version af en kolonne i ens tabel. MySQL kan bruge dette til hurtigt at finde de relevante rækker. Hvis en kolonne er indekseret kan MySQL finde de relevante rækker uden at skulle læse dem alle igennem, hvilket er hvad MySQL skal gøre hvis ikke kolonnen er indekseret.

Af indeks-muligheder findes bl.a.
Normal-indeks:
Det normale index er de mest normale.

Unikke-indeks:
Unikke-indeks er helt de samme som normale-indeks, blot med den ene undtagelse at der ikke må være to ens værdier i kolonnen.

Her udover findes der også full-text-index’er.

At indekserer de korrekte kolonner:
De kolonner der vil vinde en effektivitet ved en indeksering er dem du bruger i din where clause. Et eks.
”SELECT * FROM table WHERE tid > NOW()”
Her vil det være korrekt at indeksere kolonnen tid, da det er denne kolonne der bliver tjekket i under select statement’en.
Det kunne nu være fristende blot at indeksere alle kolonner i tabellen, for at forøge sin søgehastighed, men der er også andre ting at tage højde for. En select statement som denne:
”SELECT * FROM table WHERE tid like “%01-01” vil ikke gøre brug af et index og vil dermed ikke vinde nogen effektivitet ved en indeksering, derimod vil: ”SELECT * FROM table WHERE tid like “2004-01%” bruge et index.

Hvis du har en ide om hvilke felter der skal indekseres, men ikke er helt sikker, så kan du tilføje et index og lade MySQL analysere dette. MySQL har en indbygget funktion der kan dette, syntaksen for denne funktion er simpel:
”EXPLAIN select statement”, et eks. “EXPLAIN SELECT id FROM table WHERE forumid=2 AND status=1”.
MySQL vil nu returnere en tabel med to rækker
I den øverste række står der nogle ’navne’:

Table: Dette felt fortæller os navnet på tabellen, hvilket bliver vigtigt med ved brug af store ’joins’. Idet der her vil optræde flere tabeller, vil hver tabel have hver sin række.

Type: Hvis denne værdi står til ’all’ og der ikke prøves på at vælge de fleste tupler i tabellen, så har MySQL søgt igennem alle rækkerne, hvilket ikke er meningen. Problemet kan løses ved at tilføje nogle flere indekser.

possible_keys: MySQL giver her et forslag til et muligt navn til indekset, hvis man blot lader feltet til navnet være tomt vil indekset få navnet fra den første indekserede kolonne, hvilket ikke er særlig beskriveligt.

key: Denne viser hvilket index MySQL bruger. Hvis værdien er tom eller NULL betyder det at MySQL ikke bruger noget index.

key_len: Størrelsen af indekset der bliver brugt.

ref: Denne viser navnet på kolonnen eller ordet “const” som MySQL vil bruge til at udvælge rækkerne.

rows: Antallet af rækker som MySQL tror den skal gennemgå for at vide det korrtekt antal rækker, det bedste man kan opnå her er ”1”.

Extra: I dette felt kan der være flere forskellige oplysninger, mest om hvad der vil give en effekt i ens query.

Hvilke ulemper er der ved at indeksere?
Indekser tager plads i databasen, rigtig meget plads, derfor er det også vigtigt ikke at indeksere unødvendige kolonner. En hver mulig indeksering i en stor tabel kan resulterer i at index-filen vil blive meget stor langt større end data-filen.
Queries der skriver til MySQL, såsom DELETE, UPDATE og INSERT statements bliver langsommere. MySQL skal med et index ikke blot skrive til data-filen, men også index-filen.

Skrevet af: ahv@it.dk



Skrevet af: ahv@it.dk | Dato : 2004-02-18 11:3 | Læst : 9441 gange