03. maj 2004 - 23:11Der 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
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
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";
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
Og Vruuuuuum sagde det ... 1,3 sek ... takker mange gange for hjælpen !!
Synes godt om
Ny brugerNybegynder
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.