Avatar billede hoppe11 Nybegynder
24. august 2009 - 12:25 Der er 10 kommentarer og
1 løsning

query hænger ind imellem lidt ved select

jeg har en håndfuld selct queries som ind imellem hænger lidt..

det kan variere helt fra 0.01 til 4-5 sekunder.. langt de fleste af gangene går det fornuftigt hurtigt omkring 0.01 sekunder, men ind imellem hænger den gevaldigt.. ofte de gange den hænger er første gang man laver den pågældende select.. som om den lige skal "varmes" op..

er det bare serveren der er lidt upålidelig eller kan det være mine queries?
Avatar billede hoppe11 Nybegynder
24. august 2009 - 12:42 #1
f.eks. hvis man tager LIMIT 100,15 første gang er den langsom.. men anden gang man tager den går den lynhurtigt..!?
Avatar billede erikjacobsen Ekspert
24. august 2009 - 22:02 #2
Det er som udgangspunkt serveren, der får læst nogle data i RAM, så det går hurtigere anden gang (hvis ikke andre gøre det samme, så det ikke er cachet længere).

Men sekundært kan det sagtens også være dine queries. Har du fx styr på indexer?
Avatar billede hoppe11 Nybegynder
26. august 2009 - 10:46 #3
ja, jeg har rimelig godt styr på indekser.. :)

men jeg ved ikke om det er nogle af mine queries som er lidt for tunge? har et eksempel

$sql = "SELECT forum.id, IF(forum_att.att_stick_time, forum.time, 0) AS att_stick_time, IFNULL(tmp.max_time, forum.time) AS max_time
            FROM $DB.forum forum
            LEFT JOIN $DB.forum_att forum_att ON forum_att.contr_id=forum.id
            LEFT JOIN
            (
                SELECT forum.thread_id, MAX(forum.time) AS max_time
                FROM $DB.forum forum
                WHERE forum.id!=forum.thread_id
                GROUP BY forum.thread_id
            ) tmp ON tmp.thread_id=forum.id
            WHERE forum.forum_id='".$_GET['tab']."' && forum.id=forum.thread_id
            GROUP BY forum.thread_id
            ORDER BY att_stick_time DESC, max_time DESC";

jeg har et indeks på alle felter jeg søger efter og der er ingen delte nøgler, så det kan næsten heller ikke være fordi jeg glemmer at lave lave ekstra indekser på de delte nøgler
Avatar billede hoppe11 Nybegynder
26. august 2009 - 10:50 #4
eller her

    $sql = "SELECT forum.id, forum.time, IFNULL(event.title, forum.subject) AS subject, forum_att.att_lock_time, IF(forum_att.att_stick_time, forum.time, 0) AS att_stick_time, IFNULL(tmp.max_time, forum.time) AS max_time, tmp.num_thread
        FROM $DB.forum forum
        LEFT JOIN $DB.forum_att forum_att ON forum_att.contr_id=forum.id
        LEFT JOIN
        (
            SELECT forum.thread_id, MAX(forum.time) AS max_time, COUNT(forum.id) AS num_thread
            FROM $DB.forum forum
            LEFT JOIN $DB.forum_att forum_att ON forum_att.contr_id=forum.id
            WHERE forum.id!=forum.thread_id
            GROUP BY forum.thread_id
        ) tmp ON tmp.thread_id=forum.id
        LEFT JOIN $DB.event event ON event.thread_id=forum.id
        WHERE forum.forum_id='$key' && forum.id=forum.thread_id
        ORDER BY att_stick_time DESC, max_time DESC
        LIMIT ".$limit_arr[$key];

jeg ved ikke om det vil være bedre at dele dem op og ikke tage hver række i ét ryk!?

men jeg ville da bare mene at det er bedst at klare det over så få forespørgsler som muligt?
Avatar billede hoppe11 Nybegynder
26. august 2009 - 10:51 #5
- og det er kun i mit forum det hænger lidt, men så også der hvor der er mest data at gå igennem selvfølgelig :)
Avatar billede erikjacobsen Ekspert
26. august 2009 - 11:18 #6
Svært at sige noget sikkert om ud fra SQL-erne alene.

Men det lader til at du ved hver visning genberegner en masse ting, der reelt ikke ændrer sig. (jeg har ikke kigget så meget, men) det ser ud til at du går trådene igennem, for at finde noget info knyttet til forummet.

Hvad om du i stedet for opdaterer forummet med den info, hver gang du laver en ny tråd. Så kan du næjes med at kigge på forummet.

Læsningen bliver billigere - og det er fint, for det sker tit - mens skrivningen tager lidt længere tid, men det sker ikke så tit.
Avatar billede hoppe11 Nybegynder
26. august 2009 - 11:24 #7
hvad mener du med hver gang jeg laver en ny tråd?
Avatar billede erikjacobsen Ekspert
26. august 2009 - 12:20 #8
Jeg ved ikke præcis hvad du laver, så min formulering passer nok ikke ;)

Hvad er det, der skal beregnes ?
Avatar billede hoppe11 Nybegynder
26. august 2009 - 20:40 #9
Avatar billede erikjacobsen Ekspert
26. august 2009 - 20:50 #10
Du må gerne forklare det ... men er det du viser aktuelle tråde ved at gå ind og kigge på alle indlæg? Så er det jeg ville forklare før, at du skal skrive i tråden, hver gang der kommer et indlæg, så du umiddelbart på tråden kan se om den er aktuel.
Avatar billede hoppe11 Nybegynder
16. oktober 2010 - 17:52 #11
lukker
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