Het gaat hier dus niet om het bouwen van een top 100 of het opsplitsen van de top 100 in pagina's
Op de pagina van de gebruiker staat vermeld op welke plek hij/zij staat in de top 100, opgebouwd uit het aantal punten dat een gebruiker heeft.
De query hiervoor is niet al te moeilijk:
Het probleem hiermee is dat het voor 100 of 10.000 gebruikers een niet al te zware query is.
Bij meer gebruikers is de query zwaarder naarmate de gebruiker lager in de ranglijst staat (er moeten meer rows ge-'count' worden).
Dit levert een gigantische load op de database op.
Tot gisteren cachte ik het resultaat van een gebruiker voor 3 minuten. Dit bleek niet meer afdoende.
Vandaag ben ik overgeschakeld op het cachen per aantal piunten.
Op die manier hoef ik de plek in de ranglijst maar eenmaal te bereken voor iedereen die 10, 20 ,30 (etc) punten heeft. (dit resultaat wordt ook gecached voor 3 minuten)
Dit levert echter nog steeds een CPU-gebruik van 40% op (op een dual CPU server)
Logischerwijs is dit onacceptabel.
Ik heb nu 2 mogelijkheden... deze plek in de ranglijst verwijderen van de site of het geheel zwaar optimaliseren.
De query gebruikt een index (resultaat EXPLAIN is in MySQL 'Using where; Using index').
Ik kan natuurlijk een ranglijst maken waar iedereen in voorkomt en ELKE gebruiker een update naar de juiste positie geven per x minuten. Ik vrees echter dt dit bij 10.000-en gebruikers nog veel zwaarder is.
Is mijn huidige manier een efficiente manier van berekenen van de plek van een gebruiker in de ranglijst? Of heeft iemand nog tips voor mij om e.e.a. efficienter aan te pakken (behalve het langer cachen van de resultaten)
Op de pagina van de gebruiker staat vermeld op welke plek hij/zij staat in de top 100, opgebouwd uit het aantal punten dat een gebruiker heeft.
De query hiervoor is niet al te moeilijk:
code:
1
2
3
| SELECT count(x) + 1 FROM table WHERE aantal_punten > [aantal_punten_van_user] |
Het probleem hiermee is dat het voor 100 of 10.000 gebruikers een niet al te zware query is.
Bij meer gebruikers is de query zwaarder naarmate de gebruiker lager in de ranglijst staat (er moeten meer rows ge-'count' worden).
Dit levert een gigantische load op de database op.
Tot gisteren cachte ik het resultaat van een gebruiker voor 3 minuten. Dit bleek niet meer afdoende.
Vandaag ben ik overgeschakeld op het cachen per aantal piunten.
Op die manier hoef ik de plek in de ranglijst maar eenmaal te bereken voor iedereen die 10, 20 ,30 (etc) punten heeft. (dit resultaat wordt ook gecached voor 3 minuten)
Dit levert echter nog steeds een CPU-gebruik van 40% op (op een dual CPU server)
Logischerwijs is dit onacceptabel.
Ik heb nu 2 mogelijkheden... deze plek in de ranglijst verwijderen van de site of het geheel zwaar optimaliseren.
De query gebruikt een index (resultaat EXPLAIN is in MySQL 'Using where; Using index').
Ik kan natuurlijk een ranglijst maken waar iedereen in voorkomt en ELKE gebruiker een update naar de juiste positie geven per x minuten. Ik vrees echter dt dit bij 10.000-en gebruikers nog veel zwaarder is.
Is mijn huidige manier een efficiente manier van berekenen van de plek van een gebruiker in de ranglijst? Of heeft iemand nog tips voor mij om e.e.a. efficienter aan te pakken (behalve het langer cachen van de resultaten)