Hoi,

Ik ben nog steeds bezig met mijn wargame maar nu heb ik een vraag over wat het beste zal zijn. Ik wil alle spelers in een Toplist zetten, dat is niet moeilijk. Maar ik dacht als alle spelers de lijst steeds bekijken dat de database dan te veel werd gebruikt omdat die lijst dan steeds gegenereerd moet worden. Om dit op te lossen ben ik bezig met een Crontab bestandje, dat is ook allemaal niet zo moeilijk maar nu komt de vraag; Als dat bestandje elke 6 uur een lijst genereerd hoe kan ik die het beste opslaan ? Terug in de database of moet ik een bestand laten maken ? Wie o wie heeft er een idee ?

Alvast bedankt,

Paul du Long
Waarom denk je dat de database te zwaar wordt belast? De volgende vragen komen dan bij mij opborrelen:
- Hoeveel gebruikers zijn er bv. gelijktijdig online?
- Hoelang doet de database over de verschillende queries?
- Hoe lang doet het php-script over het parsen?
- etc. etc.

Zonder deze gegevens is het totaal zinloos om te gaan zoeken naar een oplossing voor een probleem dat je helemaal niet hebt. En wanneer de database (te) langzaam wordt, ga dan eerst eens uitzoeken wat nu precies het probleem is. Zomaar roepen dat een cron-job de database sneller maakt, is gewoon kansloos. Vaak kun je veel beter eens gaan kijken naar het toepassen van de juiste indexen, daarmee kun je queries tot wel een factor 1000 versnellen. Caching doet natuurlijk ook wonderen.

Maar hoe dan ook, ga eerst benchmarken (met tientallen tot honderden gelijktijdige bezoekers!), dan uitzoeken wáár de problemen zitten, vervolgens kijken waar de meeste winst is te behalen en dan ga je nog eens een keer een oplossing bedenken.
Ik ben het eens met frank, plaats je datamodel en het werkelijke probleem, dan kunnen we het ergens over hebben.
Oké, weer iets geleerd; mond houden voordat je iets zeker weet
Paul,

Stel je zet alles in een bestandje, hoe veel denk je dat dat dan scheelt? PHP moet dan nog steeds de data inlezen (met MySQL is heel snel) en naar een gebruiker sturen. Qua dataverkeer helpt het niets, met enkele duizenden bezoekers totaal, en misschien enkele honderden tegelijk online is de serverbelasting redelijk te verwaarlozen. (overigens maakt dat voor jezelf en de kosten, als je een externe hoster hebt, niet zoveel uit)

Het was een idee van je dat dan de database wel eens te vaak belast kan worden?
Dat gaat niet, een database kan je zoveel belasten als nodig, (overbodig belasten is het in dit geval niet, omdat je (bijna) niet meer gebruik maakt van de server dan wanneer je een bestandje aanmaakt met de data)
Database server raakt niet zomaar overbelast. Die servers zijn er op ontworpen om enorme hoeveelheden data te kunnen verwerken.
Hier een voorbeeldje van gegevens die ik tijdens het testen op het scherm laat zetten voor de benchmark:

Total generation time: 0.167268037796s

Application: 0.0152032375336s

Database: 0.152064800262s

opening db connection: 0.112567901611s
validate_person: 0.0162498950958s
list_role_ui_permissions: 0.0232470035553s

Het gaat hier om een applicatie die gebruik maakt van PostgreSQL waarbij alles via PL/pgSQL wordt aangeroepen. In dit geval zijn dat 2 API's, validate_person en list_role_ui_permissions. Daarnaast moet er een verbinding met de database worden gemaakt en php moet de resultaten parsen. Zoals je ziet duurt het vele malen langer om de verbinding te maken, dan om de API's de queries uit te laten voeren (hier zitten een stuk of 20 gekoppelde tabellen achter!) en de boel te parsen. Zou ik deze pagina willen versnellen, dan kan ik dat eigenlijk alleen maar doen door de verbinding sneller te maken. Maar of dat gaat lukken? Ik vraag het me af en het heeft nu geen enkele prioriteit.
Oké dan weet ik dit alles ook weer bedankt. Dan werkt ik nu zonder crontab en laat de lijst gewoon rechtstreeks genereren

Reageren