Bonjour à tous,
Ceci est mon premier message sur ce forum, j'espère ne pas vous décourager en postant cet énorme pavé, mais il me semble important d'expliquer en détail le problème pour pouvoir le résoudre...
Dans le cadre d'un projet de monitoring très spécifique, je recherche une solution viable pour limiter le nombre d'entrées dans ma base de données.
Le contexte est le suivant :
Je reçoit des données de plusieurs centaines d'automates toutes les 5 minutes sous la forme de fichiers XML. J'effectue un traitement procédural pour stocker toutes les données dans une table qui contient un minimum d'INDEX, pour ne pas diminuer les temps d'écritures.
Malheureusement, les données qui m'intéressent ne sont pas les données stockées toutes les 5 minutes, mais seulement les données stockées à l'instant T chaque heure.
Exemple :
Je reçoit 10 enregistrements d'un automate de 8h à 9h, je ne veux garder que le premier enregistrement dans l'heure (celui aux alentours de 8h/8h05), et supprimer les autres;
Par contre, je ne peux en aucun cas faire mon tri sur les minutes, puisque les automates m'envoient les données à des moments différents (8h01/8h06 s'il est en retard, etc...).
La requête que j'ai trouvée permettant de faire cela est :
Dans la requête je fait deux select, c'est pour tromper MySQL et lui renvoyer un DELETE avec une liste d'uid à supprimer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DELETE FROM `webbox` WHERE uid NOT IN ( SELECT uid FROM ( SELECT * FROM (SELECT * FROM `webbox` ORDER BY timestamp ASC) as wb GROUP BY wb_serial,type,seriennummer, YEAR(`timestamp`), MONTH(`timestamp`), DAY(`timestamp`), HOUR(`timestamp`) ORDER BY wb_serial,type,seriennummer ASC, `timestamp` ASC ) foo )
En clair la requête vérifie que pour chaque enregistrement, les champs obligatoires existent au moins une fois (wb_serial + type + seriennummer ) et tout cela à chaque plage horaire.
Je me confronte à deux problèmes :
1 / Si j'exécute la requète plusieurs fois, il trouve toujours des enregistrement à enlever jusqu'à un certain point!?
Exemple (uniquement sur le SELECT après avoir exécuté la requête):
- 1ere fois : 1700 résultats
- 2eme fois : 1600 résultats
- 3eme fois : 1500 résultats
..
- 10 eme fois : 900 résultats
- 11 eme fois : 900 résultats
2 / Vu que le problème est récurrent en ligne, et ne se présente jamais en local, j'en vient à penser que cela puisse venir de ma base en ligne ?
Config en ligne :
Config locale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 protocol_version 10 version 5.1.49-3-log version_comment (Debian) version_compile_machine x86_64 version_compile_os debian-linux-gnu
Vu que j'ai l'impression d'être dans l'impasse, si vous pensez qu'il existe une autre requête qui effectue la même chose plus simplement, je suis preneur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 protocol_version 10 version 5.1.30-community-log version_comment MySQL Community Server (GPL) version_compile_machine ia32 version_compile_os Win32
Partager