2011-07-05 1 views
2

Situation: J'ai besoin d'extraire de grandes quantités de données de la base de données (~ 150k +). Puis, en utilisant PHP, je divise ces données en fonction d'un chiffre quotidien et je le compte (1er: ~ 10k, 2ème: ~ 15k, etc ...), puis incrémenter une autre valeur à partir des chiffres quotidiens. Et après cela, j'ai besoin de formater toutes ces informations dans un tableau JSON et revenir au client et afficher un graphique sur ces statistiques. Maintenant, je suis sûr que tout cela peut être bien géré par PHP mais cela créerait probablement beaucoup de charge sur le serveur + la bande passante, et surtout si le client continue d'actualiser la page pour voir les statistiques mises à jour. Ils sont également environ ~ 5k + utilisateurs quotidiens, donc leur sera beaucoup de données récupérées.Gérer des ensembles de données volumineux de MySQL vers PHP, puis vers un client dans JSON

Quelle serait la meilleure façon de gérer cela?

Remarque: Le serveur dispose d'une RAM DD3 de 4 Go.

Répondre

0

Réponse courte: ne pas effectuer les calculs à chaque fois; enregistrez les résultats du calcul dans une table de base de données et renvoyez ces résultats.

Réponse plus longue: ce qui précède, mais comprenez que cela peut être compliqué en fonction de la mise à jour de vos données. Réfléchissez à la quantité de données mises à jour qui invalide votre ensemble de résultats et concevez-le autour de cela.

2

Vous voudriez implémenter une sorte de mécanisme de mise en cache, donc chaque utilisateur n'a qu'une granularité de (disons) 1 minute. De cette façon, même si l'utilisateur martèle à l'actualisation, il exécutera la requête/collation de données db une fois par minute et obtiendra autrement les résultats précédents.

Si les données sont relativement identiques entre les utilisateurs, cela réduira encore davantage la charge totale de la base de données. En supposant que chaque utilisateur frappe rafraîchir toutes les 10 secondes, et les ensembles de données sont communs à 10% d'autres utilisateurs, puis en faisant un cache par requête avec une granularité 1 minute vous emmène de

150,000 rows * 6 times per minute * 5000 users = 4.5 billion rows fetched 

à

150,000 rows * 1 times per minute * 500 users = 75 million rows fetched. 

(par exemple 1/300e les rangées récupérées).

+0

Merci pour la réponse. Toutes les données sont uniques à chaque utilisateur, car elles ne concernent que leur compte. Je pense juste à mettre en cache les informations produites par PHP dans une table InnoDB distincte, puis à vider toutes les données toutes les 10 minutes et à les reproduire lorsque l'utilisateur réapparaît sur la page. – kashn

Questions connexes