01. september 2011 - 10:30Der er
5 kommentarer og 1 løsning
Højt antal af Select_full_join
Jeg har været ved at kigge lidt på vores phpmyadmin og set hvad den skriver om vores Mysql.
Vi har åbenbart nogle problemer med at vi mangler indeks på nogle tabeller. Vi har over 1000 tabeller, så det vil tage for langtid at gå alt igennem og se hvor vi mangler noget.
Select_full_join Antal: 1,103 k
Antallet af joins der ikke bruger indeks. Hvis denne værdi ikke er 0, bør du nøje tjekke indeksene på dine tabeller.
Kan jeg på nogen måde få fat i nogle af disse queries? Hvis jeg kan det har jeg meget nemmere ved at finde ud af hvor vi skal tage fat.
Et rigtigt lorteproblem jeg engang har været inde i. Dette er efter hukommelsen.
Du har sikkert dine filer liggende i alle mulige mapper, så 1: Byg en rekursiv gennemgang af din mappestruktur.
Parse: 2: I hver mappe åbner du samtlige php-filer (og naturligvis *.inc osv). Hvis du åbner med file() får du filen som en array med linjerne som elementer. 3: Nå du finder en linje med JOIN laver du et baglæns loop indtil du støder på et SELECT. Fra denne linje til 2-3 linjer efter JOIN-linjen gemmer du. Udover linjerne gemmer du filnavn og linjenummer. Jeg ville putte det hele i en midlertidig tabel.
Nu har du alle SELECT-statements med JOIN. Næste skridt er at finde de kolonner der IKKE er indekserede.
I en JOIN har du altid en ON-clause med nul eller flere AND-clauses. En JOIN er enten den sidste clause i statementet eller efterfølges af WHERE , ORDER BY og andet. Så her kommer der sikkert lidt håndarbejde ind i billedet medmindre du koder meget stift og dine statements er meget ens. Hvis f.eks du altid afslutter et sql-statement med ";" vil har du givet dig selv en stor hjælp i nuværende situation..
Efter en gennemgang (i hånden eller med held lidt maskimekanisk) står du med de kolonner i de tabeller det drejer sig. Næste skridt er at identificere dem i databasen "information_schema". Men nu er vi vist langt henne. Den tabel du skal kigge på er KEY_COLUMN_USAGE. Bemærk at denne metode ikke tager højde for komplekse statements med UNIONs eller subqueries.
En måske bedre metode er en gang for alle at identificere de kolonner der har behov for index.
Du siger: Vi har over 1000 tabeller, så det vil tage for langtid at gå alt igennem og se hvor vi mangler noget.
Det er ikke et uoverstigeligt problem at gennemgå tabellerne. men det er nok en anden gang.
Jeg havde dog håbet på at der var en funktion i php til at hente disse data ud fra MySQL? Men det kan være at SQL'en ikke gemmer disse join forespørgsler?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.