Avatar billede suckatphp Nybegynder
03. maj 2004 - 23:11 Der er 5 kommentarer og
1 løsning

SQL kald der tager for lang tid

Hejsa

Jeg har et kæmpe problem med et SQL der tager en krig at udføre (nok fordi det er horribelt). Men jeg har ingen anelse om hvilken del af det, som giver problemer.

$query = "SELECT DISTINCT r0405.id, r0405.rating - r0404.rating AS ratingforskel, r0405.fornavn, r0405.efternavn, r0404.rating AS gammelrating, r0405.rating AS nyrating FROM r0405, r0404 WHERE r0405.id = r0404.id ORDER BY `ratingforskel` ASC LIMIT 0, 10";


Det var squ en lang smøre... nå men ... kort sagt skal den udvælge fornavn, efternavn og rating (et tal i skak) og den skal finde dem som har tabt mest rating siden sidste liste.

Er det mit join der elendigt, DISTINCT, udregningen af forskellen mellem rating eller noget helt andet ?

Hvis nogen har en ide til hvordan det gøres bedre, så er forslag meget velkomne!

Jeg kan tilføje at det er en database med 5200 poster og det tager 18 sek. at udføre det
Avatar billede fsconsult.dk Nybegynder
03. maj 2004 - 23:29 #1
Først og fremmest.. har du indeks på de to tabeller? (på id felterne)
Avatar billede suckatphp Nybegynder
03. maj 2004 - 23:33 #2
og der bliver jeg så lige i tvivl om hvad du mener. Har flg. felter, hvoraf id er unikt (eller burde være, idet de data jeg modtager indeholder dupletter, som ikke kan fjernes uden at det giver problemer), jeg har ikke noget autoid

kreds  efternavn  fornavn  klub  rating  year  id
Avatar billede fsconsult.dk Nybegynder
03. maj 2004 - 23:41 #3
På database tabeller (som r0404 og r0405) kan der etableres et eller flere index, som hver har et eller flere felter, som gør at databasen hurtigere kan lave en søgning på netop disse felter.

Hvis du tilføjer EXPLAIN i starten af dit query, vil du istedet for dit query resultat, få at vide hvordan MySQL har tænkt sig at udføre din query, hvor du for hver tabel får at vide hvilke indekser der kan benyttes, og hvor mange data der skal sorteres i hvert niveau. Jo før MySQL vha. indekser kan reducere udtrækt, jo færre data skal sorteres/joines alt i alt, og jo hurtigere går det.


$query = "EXPLAIN SELECT DISTINCT r0405.id, r0405.rating - r0404.rating AS ratingforskel, r0405.fornavn, r0405.efternavn, r0404.rating AS gammelrating, r0405.rating AS nyrating FROM r0405, r0404 WHERE r0405.id = r0404.id ORDER BY `ratingforskel` ASC LIMIT 0, 10";
Avatar billede suckatphp Nybegynder
03. maj 2004 - 23:46 #4
ok .. det 'trick' kendte jeg ikke. Får flg. output. Det ser ud til at der ikke bruges keys .. hvordan får jeg dem 'slået til' ?

table  type  possible_keys  key  key_len  ref  rows  Extra 
r0405 ALL NULL NULL NULL NULL 5174 Using temporary; Using filesort
r0404 ALL NULL NULL NULL NULL 5256 where used
Avatar billede fsconsult.dk Nybegynder
03. maj 2004 - 23:49 #5
Syntax:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type]
    ON tbl_name (index_col_name,...)

CREATE INDEX r0404_id ON r0404 (id);
CREATE INDEX r0405_id ON r0405 (id);
Avatar billede suckatphp Nybegynder
03. maj 2004 - 23:52 #6
Og Vruuuuuum sagde det ... 1,3 sek ... takker mange gange for hjælpen !!
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