Bonjour à tous
A partir de relevé journalier de compteur d'imprimantes effectué par des requetes SNMP, je constitue une base de données
`Last check` est la date et l'heure de la requete SNMP, `Mac Address` l'adresse Mac de l'imprimante et `Engine count` le compteur de pages imprimées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE `test` ( `Last check` datetime NOT NULL, `Mac Address` varchar(17) NOT NULL, `Engine count` mediumint(9) default NULL, PRIMARY KEY (`Last check`,`Mac Address`), KEY `Last check` (`Last check`), KEY `Mac Address` (`Mac Address`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
je cherche à établir une consommation journalière, par différence des compteurs N à N-1, pour une même adresse Mac
J'ai établi une requete qui me permet de sortir ce résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT o.`Mac Address` , o.`Last check` , o.`Engine count` - po.`Engine count` FROM test o LEFT JOIN test po ON ( o.`Mac Address` = po.`Mac Address` ) WHERE po.`Last check` IN ( SELECT MAX( tmp.`Last check` ) FROM test tmp use index (`Last check`,`Mac Address`) WHERE tmp.`Last check` < o.`Last check` AND tmp.`Mac Address` = o.`Mac Address` ) ORDER BY `o`.`Mac Address` ASC limit 30;
J'ai cependant un gros problème de performance. En effet, avec environ 3000 lignes dans la table, la requete dure 15s. avec 65 000 lignes dans la table, la requete dure plusieurs heures.
pour exemple, j'ai limité à 30 résultats, avec un EXPLAIN
Qui peut m'aider à optimise ma requete et/ou ma table ?30 lignes (0.475 s)
id? select_type? table? type? possible_keys? key? key_len? ref? rows? Extra?
1 PRIMARY o index Mac Address Mac Address 53 NULL 68237
1 PRIMARY po ref Mac Address Mac Address 53 imprimantes.o.Mac Address 38 Using where
2 DEPENDENT SUBQUERY tmp ref Last check,Mac Address Mac Address 53 imprimantes.o.Mac Address 35 Using where; Using index
Ou une autre méthode ?
Encore à tous pour votre aide
Patrice
Partager