2010-08-17 5 views
3

Quel est le meilleur modèle de base de données pour stocker les visites des utilisateurs et compter les utilisateurs uniques utilisant l'IP dans une grande base de données avec 1.000.000 lignes par exemple?Système de statistiques PHP et MySQL

SELECT COUNT(DISTINCT ip) FROM visits 

Mais avec 1.000.000 d'adresses IP différentes, la requête peut être lente. La mise en cache ne renverra pas le nombre réel.

Combien de systèmes de statistiques comptent les visites uniques?

Répondre

2

Demandez à une table MyISAM avec seulement la colonne IP et l'index UNIQUE sur elle. Vous obtenez le nombre approprié en peu de temps (MyISAM met en cache nombre de lignes dans le tableau)

[ajouté après commentaires]

Si vous devez également compter les visites de chaque IP, ajouter une colonne visitCount et de l'utilisation

INSERT INTO 
    visitCounter (IP,visitCount) 
VALUES 
    (INET_ATON($ip),1) 
ON DUPLICATE KEY UPDATE 
    SET visitCount = visitCount+1 
+0

@ Mchl si la colonne IP est UNIQUE wont cette table retourne toujours COUNT = 1 par IP? – Frankie

+0

Ce sera, mais j'ai compris que William voulait compter le nombre de toutes les adresses IP distinctes.Cela peut encore être modifié en ajoutant un champ 'count' et en utilisant la syntaxe INSERT ... ON DUPLICATE KEY UPDATE ... pour l'incrémenter – Mchl

+0

Pour les visites uniques, c'est une bonne solution Sauvegarder l'adresse IP unique et l'horodateur actuel – Wiliam

2

N'utilisez pas de base de données relationnelle pour cela. Ce n'est pas conçu pour stocker ce type d'information.

Vous pouvez essayer une base de données NoSQL telle que Mongo (je sais que beaucoup d'endroits l'utilisent pour leur journalisation car elle a si peu de frais généraux).

Si vous devez coller avec MySQL, vous pouvez ajouter un index à la colonne ip qui devrait accélérer les choses de manière significative ...

+2

C'est ce que je suggérerais. Pensez également au concept de calcul des utilisateurs uniques. Calculez-le une seule fois, puis réutilisez-le. Le nombre de visiteurs uniques d'hier ne changera pas. Le nombre de visiteurs uniques la semaine dernière ne changera pas non plus. – dwich

+2

En fonction de cela, vous pouvez partitionner par jour/semaine/mois/peu importe, et créer une nouvelle table pour chaque nouvelle période. De cette façon, vous conservez toujours les informations (si vous en avez vraiment besoin) et bénéficiez du gain de performances lié à l'utilisation de tables relativement petites. Mais je dois demander, pourquoi avez-vous besoin de conserver autant de données? Pourquoi ne pas simplement résumer une fois par jour et ensuite supprimer après un mois ou deux? – ircmaxell

+0

Je sais comment utiliser les index ... Je ne demande que des modèles de base de données pour les bases de données hautement peuplées. J'ai besoin de sauvegarder toutes les données car mon framework a besoin de toutes les informations de tous les clients sur différents serveurs pour les stadistiques et autres. Merci (Quoi de plus rapide, INDEX IP, ou l'autre solution, faire une table avec des ip uniques?) – Wiliam