Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 10:34 Der er 9 kommentarer og
1 løsning

Optimering af SQL

Jeg har en del SQL´s som er ved at tage en del tid at udføre, da der hele tiden kommer mere og mere data i min DB.

Mine SQL´er har flere LEFT JOIN og jeg kunne godt tænke mig at vide om jeg frit kan rokere om på dem for at få en hurtigere forespørgsel. (og få det samme resultat!)

F.eks. har jeg i en SQL 5 LEFT JOIN.

Kan jeg placere dem andeledes for at få det til at gå hurtigere?
-- hvis ja, hvordan skal jeg så placere dem ?

Jeg bruger MySQL 3.xx.xx.
Avatar billede arne_v Ekspert
21. oktober 2004 - 10:40 #1
Er der index på alle felter som indgår i ON betingelserne ?

Det er nok det vigtigste !
Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 10:50 #2
Nej, Jeg har slet ikke anvendt index.

Jeg har bruger phpmyadmin, kan jeg putte index på ?

-- jeg har lige forsøgt og jeg ser dette i phpmyadmin:
Keyname      Type
bruger_id      UNIQUE
bruger_id_2    INDEX

--> Hvorfor står der bruger_id_2 efter jeg har markeret "index" ?
Avatar billede arne_v Ekspert
21. oktober 2004 - 10:53 #3
Nu bruger jeg ikke selv PHPMyAdmin, så jeg kan ikke hjælpe med den.

Men du bør se pæne performance forbedringer ved at sætte INDEX på
de fleter der bruges i ON.
Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 10:58 #4
Ok, men jeg har ladet felterne være "unique" indtil nu.

Hvad er forskellen på de tre typer:
1)Primary
2)Index
3)Unique

Jeg forsøger at rette ON felterne til Index, men vil også gerne høre hvad forskellen er på de tre typer.
Avatar billede arne_v Ekspert
21. oktober 2004 - 11:05 #5
unique er også et index og virker lige så godt, men unique forbyder bare duplikater
Avatar billede dsj Nybegynder
21. oktober 2004 - 11:06 #6
Det er ikke så tit at rækkefølgen af JOIN's har nogen optimerende betydning, da databaser generelt vælger deres egen måde at gennemføre SQL-statements på. Faktisk kan du slet ikke regne med, at databasen eksekvere dine SQL-statements som de står.

Når du sender et statement til databasen, udregner den en optimal plan for gennemførelsen af JOINS, sorteringer og grupperinger mv. Den endelige plan afhænger meget af, hvor gode dine indekseringer er, hvilket leder os til det faktum, at indekseringsvalg virkelig har noget at sige, når det kommer til performance. Generelt bør du have en indeksering pr. kolonne der joines, sorteres eller grupperes på, men man kan gøre langt mere med indekseringer, som dog kræver kendskab til den måde hvorpå den specifikke DBMS (i dette tilfælde MySQL) behandler hver enkelt del i SQL-statements. F.eks. kan JOIN's udføres vha. 3 forskellige algoritmer, hvor nogle er mere effektive end andre, og hvilken JOIN-algoritmer databasen vælger at bruge, afhænger af indekseringerne. Ved f.eks. at putte ekstra kolonner med i indekseringerne, er det muligt gennem implicit presortering at optimere de enkelte JOIN's. Indeksering er en lidt større videnskab og indeholder mange muligheder.

Hvis du vil gå lidt i dybden med indekseringer, er der en god artikel, som omhandler MS SQL Server, men sagtens kan bruges i forhold til MySQL, til at skabe en større forståelse. Forskellen består hovedsageligt i, hvordan man finder databasens valgte eksekveringsplan for et givent SQL-statement - i MySQL skriver man blot EXPLAIN foran SQL-statementet.

http://www.awprofessional.com/articles/article.asp?p=28285

Hvis man er tændt på det, kan man også gå i en helt anden retning for at optimere, nemlig ved at revidere selve tabel-strukturen. Dog kan det være ret tidskrævende at skulle ændre i tabel-strukturen, da diverse SQL-statements også skal omskrives. Oftest anvender man en relationel tabel-struktur til at gemme sine data, men der findes andre måder at strukturere tabeller på, som gør det muligt at optimere ellers krævende udtræk, f.eks. data warehouse-modellen. Følgende artikel har igen fokus på MS SQL Server, men teorien er generel nok og beskriver andre tabel-struktur modeller end den kendte, relationelle model.

http://www.awprofessional.com/articles/article.asp?p=27852

Det kan godt virke som lidt tør teori, hvis ikke man lige er forhippet på virkelig at lære det, men ønsker man at optimere seriøst, bør man tage ændringer tabel-struktur modellen med i sine overvejelser. Dog, hvis din relationelle tabel-struktur ikke fejler noget, kommer du langt med de rigtige indekseringer.
Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 11:15 #7
--> arne_v smid et svar.

I får 30 point hver.  (arne_v for svaret, og dsj for forklaringen bag)

Takker meget, jeg har desværre glemt en del databaseteori og praksis :)
Avatar billede arne_v Ekspert
21. oktober 2004 - 11:26 #8
svar
Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 11:44 #9
Kan man ikke forhøje pointene ?
- ellers må jeg oprette et nyt spm. med point til den ene af jer..
Avatar billede x4all_dk Nybegynder
21. oktober 2004 - 11:46 #10
arne_v --> jeg oprettet et spm. du skal svare på.
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
Computerworld tilbyder specialiserede kurser i database-management

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