28. marts 2007 - 18:26Der er
7 kommentarer og 1 løsning
For mange MySQL kald i chat
Okay, jeg har en chat.
Hver gang en bruger skriver noget, køres der 3 SQL kald: En select for at se om brugeren findes og er aktiv, en insert for at indsætte beskeden i tabellen messages, og en update for at opdatere tidspunktet for hans sidste besked i tabellen online_users
Når en bruger henter nye beskeder, hvilket sker hvert 10. sekund, køres der flere SQL kald: En select for at hente alle idlere, der ikke har skrevet i 15 minutter, en update for at sætte deres is_active til 0, en insert FOR HVER for at skrive en "x er logget ud" besked i messages, og en select for at hente alle nye beskeder og udskrive dem.
Det er jo en sindssyg mængde SQL kald. Bare jeg har 10 brugere der skriver hvert 10. sekund, vil jeg have over 5 kald i sekundet, og så vidt jeg har læst er 1 SQL kald per sekund det mest almindelige for den slags.
Mit problem er at jeg ikke ANER hvordan jeg får tallet ned. Kan det gøres via avanceret SQL, eller har nogen andre idéer?
Alt det her: En select for at hente alle idlere, der ikke har skrevet i 15 minutter, en update for at sætte deres is_active til 0, en insert FOR HVER for at skrive en "x er logget ud" besked i messages
Behøves jo ikke blive kørt hver gang du henter nye beskeder. Hvis du smider det i en skjult iframe (eller lignenede) så kan du nøjes med at køre det med det interval du ønsker, f.eks. hver 5 minut.
Endnu bedre vil det være hvis du har adgang til at køre cron job, så kan du oprette sådan et til alt "veligehold" så bliver det kun kørt 1 gang i hvert interval modsat 1 gang pr. bruger i hvert interval.
Ja, det kunne sagtens flyttes og køres lidt sjældnere. Men igen - det er jo faktisk kun ét SQL-kald, da de to sidste kun køres HVIS der er idlere, hvilket der jo i sagens natur ikke er flere gange i sekundet.
Ét mindre SQL-kald, men det er jo en dråbe i havet desværre :/ Tak anyway.
Bruger andre chats virkelig så mange SQL-kald? Altså, det er første gang jeg skriver en, så jeg har sådan set ikke forstand på det. Jeg syntes bare det lød helt vildt.
Plus jeg så at powweb.com (ikke at jeg vil bruge dem, det var bare det eneste sted jeg kunne finde info om det) har en MAX_QUERIES ting sat til 72.000 per time. Højt tal skulle man umiddelbart mene, men hvis det er normalt, vil jeg kun kunne servicere højst 5-10 brugere. Det er jo slet slet ikke nok.
En chat kræver mange kald til databasen, dem der er gode til at lave chats (det er jeg ikke) benytter så vidt jeg har hørt AJAX, og hvis jeg har forstået det rigtig er det bla. for at begrænse mængden af kald til databasen.
Selvfølgelig at det med at være på den sikre side, men jeg syntes måske nok at det er lidt overdreven at brugerne skulle skrive en ny besked hver 10 sek.
Det var så lidt, samler ikke på point, så snup dem selv. :-)
Om det er overdreven, kan jeg nok ikke vurdere, men jeg kan da sammenligne med med min server (som godt nok ikke køre nogen fast hårdt belastet chat). Den har et gennemsnit over på 26 opslag i sek., og alligevel ligger belastningen på selve maskinen på max 10-15%
De fleste alm. webhoteller tillader vist ikke scripts som reloader med et fast interval, så hvis du på et tidspunkt alligevel skal ud og kikke på dedikeret server, så har du jo masse af computerkraft til at trække selv ret mange brugere.
Tak alligevel :) Jeg har lige skrevet til et par webhoteller og spurgt om de havde regler mht. den slags, og det havde de ikke, så det er fint.
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.