24. august 2009 - 12:25Der 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?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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?
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
$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?
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.
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.
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.