Bonjour, je travaille sur une application J2EE (Spring/Hibernate) qui gère une base de données assez simple et qui normalement ne sera pas énorme. J'ai tout de même rempli ma table historique avec 5 millions d'entrées pour faire des tests de fiabilité et voir un peu comment réagit mon programme. Cette table reçoit des relevés de valeurs à intervalles réguliers et est donc vouée à grossir continuellement, d'où un besoin de performance (même si je n'attendrais pas 5 millions d'entrée avant 10 ans)
Voilà la table (exportation phpmyadmin) :
Je fais sur cette table la requête SELECT suivante qui prend environ 7 secondes (mes dates sont stockées en millisecondes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE `history` ( `id` int(11) NOT NULL auto_increment, `idnode` varchar(30) NOT NULL, `idsensor` varchar(30) NOT NULL, `date` bigint(30) NOT NULL, `value` varchar(20) NOT NULL, PRIMARY KEY (`id`), KEY `date` (`date`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5693085 ;
Lorsque je mets le ORDER BY en DESC, la requête prends 9 secondes. Lorsque je mets le ORDER BY sur mon champs date, elle prend 25 secondes (asc ou desc).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT * FROM `history` WHERE `idnode` = '000D6F00000B4E3E' AND `date` > 1211752800000 AND `date` < 1211794628000 ORDER BY id
Je ne suis pas du tout un spécialiste du SQL mais quand je vois que de menus changements peuvent provoquer autant de différences de performance, je me dis qu'il y a surement moyen de faire beaucoup mieux.
Si vous avez des idées pour optimiser cette requête, mettre en lumière des incohérences de construction de ma table où autre qui pourrait m'aider à gagner en puissance, je prends.
Merci d'avance.
Partager