Bonjour,
Je réalise actuellement un système de gestion de données émis pas un grand nombre de capteur.
Je souhaiterai pouvoir faire « rapidement » des statistiques sur la fréquence d’utilisation des capteurs.
Par Statistiques j’entends : Être capable de générer un tableau qui classerait par fréquence d’utilisation des adresses (champs addr) émise lors de la dernière heure, puis lors du dernier jour. Pour voir quelles adresses sont le plus souvent sollicité. Le problème pour moi, c’est que c’est un jour, ou une heure « glissante » pour coller au mieux à la réalité en temps réel.
Voilà le schéma de ma table principale :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE IF NOT EXISTS `cap_value` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `addr` varchar(32) NOT NULL, `date` int(10) unsigned NOT NULL, `target_id` int(10) unsigned NOT NULL, `from_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Je reçois en moyenne 2 valeurs par secondes, donc en un jour la table grandi de 170 000 lignes, 10 jours après j’ai donc environs 1.7 millions de lignes, d’où le besoin de trouver un système fiable, rapide et indépendant du nombre de ligne.
Pour le moment le meilleur moyen que j’ai trouvé est une requête de ce style :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT COUNT(*) AS total, addr FROM `cap_value` WHERE `date` >=1330270773 /*<----- H-1 ou J-1*/ GROUP BY addr ORDER BY total DESC
Sur une table de 8 Millions de lignes cette requête dure 4 secondes, sachant que l’application est en php et destiné au "web", le temps est trop long, même avec un petit système de cache j’ai peur que la charge du serveur (qui est plutôt modeste au passage) ne cesse de monter.
Dans un premier temps, est-ce que vous pensez que mon schéma est correct, et ensuite comment est-ce que vous procéderiez ? Créer une seconde table pour garder que les enregistrements des dernières 24h serait-elle une meilleure approche ?
Est-ce que la création d'une vue serait une autre alternative ?
Cordialement,
Ps : "addr" est composé au maximum de 32 caractères (^[a-z0-9]{2,32}$ exactement) et peux prendre des milliers de valeurs.
Partager