Je travaille pas un site qui stocke des vues individuelles de page dans une table « vues »:La meilleure façon de stocker vues/stats dans MySQL
CREATE TABLE `views` (
`view_id` bigint(16) NOT NULL auto_increment,
`user_id` int(10) NOT NULL,
`user_ip` varchar(15) NOT NULL,
`view_url` varchar(255) NOT NULL,
`view_referrer` varchar(255) NOT NULL,
`view_date` date NOT NULL,
`view_created` int(10) NOT NULL,
PRIMARY KEY (`view_id`),
KEY `view_url` (`view_url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Il est assez basique, de magasins (id de l'utilisateur sur la site), leur adresse IP, l'url (sans le domaine pour réduire la taille de la table un peu), l'URL de référence (n'utilisant pas vraiment cela en ce moment et pourrait s'en débarrasser), la date (AAAA-MM-JJ format bien sûr), et l'horodatage unix de quand la vue s'est produite.
La table, bien sûr, devient assez grande (4 millions de lignes pour le moment et c'est un site plutôt jeune) et les requêtes en cours sont lentes.
Pour une optimisation de base que j'ai créé une table « views_archive »:
CREATE TABLE `views_archive` (
`archive_id` bigint(16) NOT NULL auto_increment,
`view_url` varchar(255) NOT NULL,
`view_count` smallint(5) NOT NULL,
`view_date` date NOT NULL,
PRIMARY KEY (`archive_id`),
KEY `view_url` (`view_url`),
KEY `view_date` (`view_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Cela ne tient pas les informations de l'utilisateur (et l'URL de référence) et stocke combien de fois url a été vu par jour. C'est probablement la manière dont nous allons généralement utiliser les données (combien de fois une page a été consultée par jour), donc l'interrogation devrait être assez rapide, mais même si je l'utilise pour remplacer principalement la table 'views' (à droite maintenant j'imagine que je pourrais montrer des pages vues par heure pour la dernière semaine/mois ou alors et montrer les vues journalières au delà de cela et ainsi seulement besoin de la table 'views' pour contenir les données de la dernière semaine/mois) mais c'est quand même table. Quoi qu'il en soit, histoire courte, je me demande si vous pouvez me donner des conseils sur la meilleure façon de gérer le stockage de statistiques/pages vues dans un site MySQL, le but étant à la fois de garder la taille de la table (s) dans le db aussi petit que possible et toujours être en mesure de facilement (et au moins relativement rapidement) interroger l'info. J'ai regardé un peu les tables partitionnées, mais MySQL 5.1 n'est pas installé sur le site. Tous les autres conseils ou idées que vous pourriez offrir seraient très appréciés.
umm, doesn Est-ce que votre serveur a un journal d'accès qui garde déjà toutes ces données? Il y a beaucoup de visionneuses/résumés de journaux là-bas pour les journaux d'accès Web. Y a-t-il une raison impérieuse de ne pas en utiliser une? – dnagirl
Quel est le but de la colonne view_created? –
Le but de la colonne view_created, MicWafflestix, serait utilisé si je voulais afficher les vues toutes les heures (disons combien de fois un article était vu chaque heure aujourd'hui). Je suppose que je pourrais utiliser DATETIME au lieu de l'horodatage INT (10), mais je ne suis pas sûr que cela m'aiderait beaucoup. – Charlie