Indexing MySQL samt slow_query_log

Hej,
jeg oplever efter serverskift en noget tungere afvikling af MySQL, og et skyldes nok primært nogle tunge query. Umiddelbart kan jeg læse mig til at det bedste man kan gøre for at afhjælpe problemet (nogle gange går den helt i stå), er at sikre at indexeringen er god. Hvordan skal den gennemføres?
Derudover kan jeg læse at jeg kan sætte serveren til at logge tunge scripts via slow_query_log - jeg kan bare ikke få det til at virke?

Hejsa @psto
Helt korrekt. Indeksering af nødvendigt og et must, når man har meget load og/eller meget data. Nej .. Lad mig omformulere dette - indeksering er ALTID nødvendigt ;)
Vi er ikke nået hertil i vores PHP- & MySQL-videoer endnu, men det er planlagt som en af de næste emner vi kommer ind på ifm. en ny case hvor vi skal bygge en Password-manager alá 1Password i PHP.
Men indtil vi er klar med dette, lad mig prøve at hjælpe dig her i vores forum, med nogle tips og fifs.
Indeksering går kort fortalt ud på at du laver en indeks over dine data.
Hvis du har en tabel med 100.000 rækker, og INGEN indeksering skal MySQL søge alle 100.000 række igennem hver gang du kører en query op imod din tabel. Selv små tabeller med 1000 rækker uden et index kan trække tænder ud, hvis der er mange queries i sekundet, da alle 1000 rækker da parses hver gang - eller hvis du begynder at lave JOINs mellem andre tabeller, som heller ikke har et INDEX.
Når du har sekunders svartid, lyder det bestemt til at du ikke har fået opbygget korrekte INDEXs, og at problemet kan løses helt, ved at opbygge disse INDEXs.
Et index er kort fortalt en lille opslagsdatabase som MySQL automatisk kan lave, som gør det muligt for MySQL at finde de data du leder efter, uden at scanne ALLE rækkerne igennem i din tabel - men for at MySQL kan lave et index for dig, er du nød til at hjælpe den lidt på vej, og fortælle den hvad den skal bygge sit index på, altså hvilke felter den skal indeksere.
Forestil dig et Index som en indholdsfortegnelse af en bog, der står hvad side man lede, det er noget hurtigere end at lede hele bogen igennem.
Til og starte med, vil jeg anbefale dig at lave et index på hvert felt i dine tabeller, og herfra kan vi arbejde med at bygge mere smarte indexs. Men hvis du starter med at lave et index på alle dine felter i hver tabel, så er jeg sikker på du tager 98% af dit load væk. Omend det ikke er den smarte løsning, er det en god "starter"-måde at opbygge indexs på.
Du laver et index med følgende SQL:
CREATE INDEX index_name
ON table_name (column_name)
F.eks. hvis jeg har tabellen "Medlemmer" og jeg har tre felter heri: email, navn, postnummer:
CREATE INDEX idx_email
ON Medlemmer (email)
CREATE INDEX idx_navn
ON Medlemmer (navn)
CREATE INDEX idx_postnummer
ON Medlemmer (postnummer)
Jeg vælger at kalde min indexs idx_ + feltnavn, altså idx_email, men dette index-navn er 100% valgfrit.
Du kan også lave lidt mere komplekse indexs hvor du indekserer 2 felter i éet index, hvis du f.eks. ofte laver en query der hedder: WHERE navn = 'Daniel' AND postnummer = 8000 giver det mening at lave et index der indeholder begge felter:
CREATE INDEX idx_navnpostnummer
ON Medlemmer (navn, postnummer)
Håber dette hjælper dig lidt på vej, ellers er vi klar til at hjælpe dig.
God weekend
Med venlige hilsner Daniel Bahl (@db)
CEO – v5.dk ApS

Hej Daniel
Jeg har nok ikke helt forstået hvordan jeg udnytter indeksering korrekt, trods din udførlige beskrivelse. Som jeg forstår det, anbefaler du at lave indeksering på ALLE kolonner i tabellerne. Hvilken effekt giver det? Og vedligeholder indekseringen sig selv efterhånden som der kommer flere rækker i tabellen?
I phpMyAdmin er der en funktion der under "Struktur" for den enkelte tabel og kolonne hedder "Indeks". Den laver en SQL der hedder
ALTER TABLE `table_name` ADD INDEX ( `column_name` ) ;
Giver det samme effekt? I phpMyAdmin findes ydermere mulighed for at Indeksere samtlige rækker i tabellen. Giver det samme effekt?
Hvad opnår jeg ved at lave din SQL hvor jeg kalder alle index samme navn med et prefix - er det synlighed over hvilke kolonner der er indexeret eller ?
Mange hilsner - Patrick
Redigeret af
@psto
d. 09.04.2016 kl. 11:14

Hejsa,
Yep, et index vedligeholder sig selv når der kommer nye rækker - og det gælder automatisk for ALLE rækker i en tabel.
Jeg vil anbefale dig at starte med at lave et index for hver kolonne. Så er du rigtigt langt, så er MySQL nemlig selv så klog, at den finder det index der passer bedst til den aktuelle QUERY der skal løses.
Herefter kan du begynde at lave lidt mere smarte INDEXs, lad os sige du ofte kalder en QUERY der lyder således:
SELECT firstName, email FROM Members WHERE firstName = ? AND lastName = ?
Her vil det så give mening at lave éet INDEX der indeholde to kolonner, nemlig både firstName og lastName, ex.:
CREATE INDEX idx_fullname
ON Members (firstName, lastName)
Navnet på et index er fuldstændig ligegyldigt, du kan kalde det "pstoTomatSovs", hvis du lyster. Det er blot for at have- og holde en standard.
Du kan se alle indexs for en given tabel ved at køre denne QUERY:
SHOW INDEX FROM Members;
Med venlige hilsner Daniel Bahl (@db)
CEO – v5.dk ApS