Supposons que j'ai une table MySQL qui conserve la page de visite de la page et que je souhaite garder une trace du nombre total de visites de page pour chaque utilisateur. Voici le SQL pour incrémenter le champ: C'est assez simple mais je me demande s'il y a un moyen plus rapide de y parvenir. Je veux dire si j'ai beaucoup de visiteurs (idéalement des millions d'utilisateurs par jour), est-ce suffisamment méthode ou je devrais utiliser une méthode alternative. Merci. P> p>
3 Réponses :
avec un index sur user_id code> Ce sera assez rapide. Je doute que vous puissiez obtenir un résultat (sensiblement) plus rapide en utilisant d'autres moyens. Vous rencontrerez probablement d'autres problèmes de performance / serveur avec des millions d'utilisateurs que cette requête (certains appelez cette "micro-optimisation") p>
Ces types de requêtes sur des sites à haute lecture peuvent effectivement être tout à fait dévastatrices, en particulier sur Myisam ... jeterais dans une zone de stockage secondaire et des mises à jour de lotting permettent beaucoup.
@Adrianschneider - Quelles données vous attire de cette conclusion (subjective)?
Expérience personnelle traitant de sites de trafic assez élevés. Avec verrouillage de la table, chaque mise à jour verrouille la table pour une fraction de seconde. Si cela se produit toujours sans arrêt, la table verrouille en permanence chaque seconde. C'est bien mieux sur le verrouillage au niveau des lignes évidemment, mais j'aime toujours quelque chose que j'aime éviter. Pas un problème pour les sites bas de circulation.
Donc, le verrouillage de la table est l'obstacle et est allégé avec InnoDB?
Oui. L'insérer dans une autre table atteste cela, par rapport aux mises à jour qui provoquent le verrouillage.
Quelques choses ont été mentionnées ici. Donc, pour ajouter plus à la question, quelle solution pensez-vous est la meilleure pour un site Web qui a beaucoup de visiteurs (comme Facebook)? Pour expliquer davantage, supposons quelque chose comme la table "comme" de Facebook. Je suppose que chaque seconde il y a des centaines de hits sur le lien "J'aime" sur Facebook. Je suis curieux de ce genre de solutions.
@ALIREZANOORI: Ils utilisent beaucoup (quand je dis beaucoup, je veux dire beaucoup (40k +) de serveurs pour cela. Je parie que la table est en quelque sorte partré.
Facebook est un cas particulier, car ils utilisent HiPhop pour PHP et MEMCACHÉ pour augmenter l'évolutivité de leur application.
Merci à tous pour les réponses et les commentaires. J'ai beaucoup appris de ceux-ci.
Je ne pense pas que cela soit significatif plus rapide, mais une chose que vous pouvez faire est d'empiler leurs visites et de mettre à jour les clics compter une fois par minute par le travail cron. Assurez-vous simplement que user_id code> est indexé p>
Seul prob avec ce cache est volatile, donc si la paire de la clé / de la valeur est perdue, il perdra ses visites comptant.
@ Col.shrapnel: c'était juste un exemple
+1 Vous pouvez également avoir la mise à jour de l'application la base de données toutes les 1000ème fois qu'elle incrémente la clé memcached. Si Memcached se bloque, mettez à jour les visites de la base de données par RAND () * 1000.
haha bonne solution! Il suffit de la mettre à jour par Rand () * 1000 d'ici la fin de la journée et ne vous inquiétez pas avec la mise en cache du tout :)
@Billkarwin: Hmm, ce n'est pas une bonne solution, je pense. J'ai enlevé Memcached en tant que solution, car il a tendance à cracer
Eh bien, l'OP a dit qu'il le voulait vite, il n'a pas dit qu'il voulait que ce soit exacte. :)
@Billkarwin Je ne pensais pas qu'il était nécessaire de mentionner exacte mais de la clarifier, je voudrais dire, je le veux exactement et rapide.
avec un index sur visites code> Cela pourrait être assez lent.
Je conseillerais de le laisser comme ça, jusqu'à ce que vous obteniez au moins 10 000 utilisateurs.
Comme vous devrez réécrire votre code plusieurs fois de toute façon. p>
Supposons que vous ayez 10 000 utilisateurs. Que suggéreriez-vous comme la solution alors?
Cela dépend de l'utilisation d'un nombre aussi assez inutile. Pour Starter, je ne me dérangerais pas avec un compteur aussi idiot, mais utilisez plutôt Google Counter ou implémenter un analyseur de journal. Mais comme vous vous attendez à une solution de base de données, je ferais ce champ non indexé et implémenterais un agrégateur de statistiques hors ligne pour obtenir les numéros. Avec 10k visiteurs par jour, il est toujours tout à fait inutile.
Merci. Eh bien, tout d'abord, j'ai simplifié mon besoin avec ce code "stupide". En pratique, je n'utilise pas ce code, juste un exemple de ces types de questions. 2ème de tous, pourriez-vous s'il vous plaît expliquer plus sur le guichet Google? J'aimerais en savoir plus à ce sujet. Merci encore.
@ALIREZANOORI C'est Google Analytics, je veux dire. Un outil puissant pour compter les visites.
Le moyen le plus rapide est de MySQL lui-même, ce qui vous fait généralement par votre requête. Toute autre alternative que je puisse penser au sommet de ma tête nécessiterait de tirer les données, de la modifier avec PHP, puis de la mise en place des données. Ce qui est redondant si tout ce que vous avez à faire est d'incruster une colonne lorsque vous pouvez le faire via votre requête.
Coller avec elle. Si votre user_id est une clé primaire (idéalement une auto_incrènement), vous êtes sur la bonne voie. Vous aurez des déclarations plus lentes que vous devez vous inquiéter lorsque vous pensez à 1 Mio. utilisateurs (sans parler des vues et des requêtes de page).