Bonjour
Je développe un programme de consolidation de données dont le principe est le suivant :
Une application récupère des valeurs correspondants à différentes grandeurs chaque minute et les stocke dans une table de valeur, avec les identifiants de la valeur et la date - heure de mesure - les id + le date_time sont la clé de la table.
Pour consulter les données sous la forme de sommes, moyennes, minimum ou maximum plus rapidement (par 5 minutes, par heure ou encore par jour ou par mois), on a fait le choix de créer des tables "en dur" des valeurs groupées qui sont calculés simplement avec un Select AVG(valeur) et un Group By sur FLOOR(Minute(valeur.Date_Time)/5)*5) pour les 5 minutes par exemples.
Ca marche très bien jusque là, et au lancement de l'application de consolidation, toutes les valeurs sont recalculées en à peine 1 minute sur 1 machine qui n'est pourtant pas super puissante. La table des valeurs compte actuellement environ 1 million d'enregistrements pour 60 grandeurs.
Là où ça se corse, c'est lorsque je veux faire des mises à jours, puisque chaque minute de nouvelles valeurs sont insérés dans ma table principale :
Chaque 5 minutes, je récupère donc pour chaque grandeur l'heure de la dernière mise à jour puis réalise un INSERT avec un ON DUPLICATE KEY UPDATE. Les valeurs insérées sont issues d'un SELECT similaire au premier. Ca fonctionne mais c'est vraiment très lent : 5 fois plus de temps la méthode DELETE puis INSERT, alors que le volume de données traitées est bien plus faible !
Comment pourrais je faire pour optimiser cela ? Sans passer par une appli mais directement avec des triggers sur ma table des valeurs dans mysql ?
Merci d'avance.
Partager