Avatar billede jakl2 Nybegynder
01. september 2011 - 10:30 Der 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.
Avatar billede vagnk Juniormester
01. september 2011 - 12:24 #1
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.

Håber dette får dig lidt frem.
Avatar billede jakl2 Nybegynder
06. september 2011 - 09:01 #2
Hej Vagn

Tak for din gennemgang. Den vil jeg se på.

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?
Avatar billede coderdk Praktikant
07. september 2011 - 20:56 #3
Du kan slå slow query log til, så får du en liste over dårligt ydende forespørgsler.
Avatar billede jakl2 Nybegynder
08. september 2011 - 08:15 #4
coderdk > Det fik jeg også gjort en time i går. 7mb / 80.000 linjer.

Finde der et program til gruppering af queriene eller er det bare den hårde metode?
Avatar billede jakl2 Nybegynder
16. september 2011 - 08:06 #5
Vagnk og coderdk vil i begge smide et svar, så vil jeg fordele pointene mellem jer.
Avatar billede jakl2 Nybegynder
16. november 2011 - 09:38 #6
Lukker da i ikke har smidt svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester