2012-03-25 4 views
0

Considérez la situation suivante: Vous souhaitez mettre à jour le nombre de pages vues de chaque profil de votre système. Cette action est très fréquente, car presque toutes les visites sur votre site aboutissent à une page incrémentielle.Définition de la cohérence éventuelle (validation tardive) dans MySQL

La méthode de base est mise à jour Les utilisateurs définissent page_views = page_views + 1. Mais ce n'est pas totalement optimal car nous n'avons pas vraiment besoin de mise à jour instantanée (1 heure de retard est ok). Existe-t-il un autre moyen pour retarder une séquence de mises à jour dans MySQL et faire des mises à jour cumulatives plus tard?

J'ai moi-même essayé une autre méthode: stocker un compteur (nombre d'incréments) pour chaque profil. Mais cela se traduit aussi par la gestion de quelques milliers de petits fichiers, et je pense que le coût d'E/S du disque (même si une structure arborescente profonde pour les fichiers est appliquée) dépasserait probablement la base de données.

Quelle est votre suggestion pour ce problème (autre que MySQL)?

+1

Est-ce que [this] (http://stackoverflow.com/questions/2459395/deferring-frequent-updates-in-mysql) aide du tout? –

+0

Ceci est très utile. Définitivement je vais l'essayer;) Merci beaucoup. – hiro

Répondre

2

Pour améliorer les performances, vous pouvez stocker vos données d'affichage de la page dans une table MEMORY - la table ne persiste que c'est super rapide mais temporaire, alors que le serveur est en cours d'exécution - le redémarrage, il sera vide ...

Vous pouvez ensuite créer un EVENT pour mettre à jour une table qui conservera les données sur une base temporisée. Cela permettrait d'améliorer un peu les performances avec le risque que, en cas de panne du serveur, seul le nombre de visites depuis la dernière exécution de l'événement soit perdu.

+1

La table de la mémoire n'est pas durable, donc je pense que cela entraîne certains frais généraux pour manipuler la date dedans et dehors.Mais c'est prometteur! Pour la méthode tardive. Je développe une habitude lors de l'utilisation de base de données est d'utiliser rien d'autre que la clé régulière (aucun événement, aucun déclencheur, aucune procédure, aucune clé étrangère ...), car il deviendrait si difficile à l'échelle. – hiro

1

Le lien posté par James via le commentaire à votre question, où se trouve une réponse acceptée avec un autre commentaire sur memcached a été ma première pensée aussi. Il suffit de stocker le profileIds dans memcached puis vous pouvez configurer un cron pour exécuter toutes les 15 minutes et saisir toutes les entrées puis émettre les mises à jour de MySQL dans un lot, mais il y a quelques points à considérer.

  1. Lorsque vous exécutez le script batch pour saisir les ids sur memcached, vous devrez vous assurer de supprimer toutes les entrées qui ont été analysés, sinon vous courez le risque de compter le même profil vues plusieurs fois. Étant donné que memcache ne prend pas en charge la recherche avec des caractères génériques via des clés et que vous devrez purger les clés existantes pour la raison indiquée au point 1, vous devrez probablement configurer un pool de serveurs memcache distinct dédié à la seule utilisation des identifiants de profil de suivi, de sorte que vous ne finissez pas par purger les valeurs mises en cache qui n'ont aucune relation avec le suivi de la vue du profil. Toutefois, vous pouvez éviter cela en stockant le profileId et un horodatage dans la valeur utile, puis demandez à votre script batch de parcourir chaque entrée et de vérifier l'horodatage, s'il se situe dans la plage de temps spécifiée, ajoutez-le à la file d'attente pour être mis à jour Une fois que vous atteignez la limite supérieure de votre plage de temps, le script s'arrête.

Une autre option peut être d'analyser vos journaux d'accès. Si les profils utilisateur se trouvent dans un emplacement connu, par exemple /myapp/profile/1234, vous pouvez analyser ce modèle et ajouter des vues de profil de cette façon. J'ai fini par devoir suivre cette voie pour le suivi des annonceurs, car c'était le seul moyen répétable de générer des numéros de facturation. S'ils avaient des problèmes de facturation, nous leur proposerions de leur envoyer les journaux d'accès et de les analyser eux-mêmes.

+0

Répondre à tout? –

Questions connexes