Jeg har en MySQL database som bruger for mange serverkræfter og nu har jeg gennemgået mine SQL-kald og det er ikke ret voldsomme så jeg tror ikke det er dem der driller. Men måske er det min database opsætning. Jeg har en tabel der hedder Billeder (110.000 poster) og en der hedder Kalender (2000 poster) som er relateret sammen. Billeder tabel: id - (index) og autonummerering ref - Det er ID nummeret på den post i tabellen Kalender hvor billederne er fra. Så er der en masse andre felter såsom opløsning, format, filnavn osv. lignende billedinfo om den enkelte fil. Kalender tabel: kampid - (index) og autonummerering (Det er dette nummer der refereres til i Billeder-tabellen i feltet ref. Begivenhed Dato Kategori ID - Henter det fra en Kategori-tabel Hold ID1 - Henter det fra en Hold-tabel Hold ID2 - Henter det fra en Hold-tabel OSV. med en nogle felter med info som der ikke søges i. Når jeg henter en side med en oversigt over alle billeder der har ref (Billeder-tabel)/kampid (Kalender-tabel) så overbelaster det MySQL-serveren. Har jeg ikke forstået det rigtigt det med INDEX i en tabel. Alle mine tabeller har jeg markeret INDEX ved det felt som er ID (unikt for alle poster) Men skal jeg sætte INDEX på flere felter f.eks. alle dem der indeholder ID'er der har relationer (søger/henter) fra andre tabeller eller hvordan? Vil det kunne mindske min serverbelastning? /Magnus |
Hej,
Et index fungerer ligesom et indeks i en bog. Hvis du forestiller dig at du har en liste med billeder, som ser således ud:
1. Billed1
2. Billed2
3. Billed3
4. Billed4
5. Billed5
Hvis du så laver følgende MySQL-query: SELECT * FROM billeder WHERE id = 3 så gør databasen følgende:
- Den kigger på Billed1, dens id er ulig 3, så vi fortsætter søgningen
- Den kigger så på Billed2, dens id er ulig 3, så vi fortsætter søgningen
- Den kigger så på Billed3, dens id er ulig 3, så den række returnerer vi.
Denne proces kan tage vildt lang tid hvis du har en database med 100.000 af rækker uden noget index. Derfor kan det være smart at benytte indexes på ting som der bliver søgt efter. Hvis vi skal se på ovenstående søgning ved hjælp af en indeks:
- Databasen kigger i indekset efter id = 3, og returnerer det.
Man kan så spørge sig selv, hvorfor putter man så ikke bare indexes på alle kolonner? Dette gøres ikke fordi der er behov for at opdatere indexes hver gang man indsætter noget i tabellen. Et index giver hurtig læsning, men en sløvere skrivning.
En regel til at huske indexes er: Altid index på foreign keys (da de ofte bliver brugt i joins) og altid index på id'er.
En anden ting du kan gøre for at teste dine queries er at benytte dig af MySQLs EXPLAIN funktionalitet på dine mest benyttede queries. Denne er ret praktisk, da den fortæller dig hvilke indexes en query bruger, hvis nogen. Dette gøres ved at logge ind på din MySQL server, eventuelt gennem kommandolinjen og skriver EXPLAIN SELECT * FROM billeder WHERE id = 3.
Du kunne også begynde at kigge på caching af resultater hvis du har en query som kører meget ofte, og som ikke behøver at blive kørt konstant.
Hiv gerne fat i mig hvis du har behov for hjælp, jeg hjælper meget gerne og burde have et par timer denne weekend til at kigge på det. Min mail er: kaspergrubbe@gmail.com eller skype: kasper.grubbe