Bonjour à tous.

Petite mise en situation de mon problème :
Dans ma maison il y a X capteurs de températures dont les mesures sont stockées toutes les 5 minutes par un logiciel dans une base de donnée. Celui-ci remplit alors une table d'une base Mysql qui à la structure suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
   CHAMP            TYPE
  DATETIME        DATETIME
Id_capteur1        float
Id_capteur2        float
Id_capteur3        float
Id_capteurx        float
    ....           float
Afin de simuler une utilisation dans le temps, j'ai généré une table simulant un peu plus de 5 ans de relevés de températures. On obtient alors une table d'un peu plus de 40 Mio contenant un peu plus de 635100 enregistrements.

Ce que je souhaite en faire et pourquoi ?
Le but d'une telle base de données et bien entendu d'abord et avant tout de permettre de comparer celles-ci d'une année sur l'autre, d'un jour sur l'autre, ect ... Pour ce faire la façon la plus parlante pour nous autres êtres humains se trouve être de mettre en forme ces données dans un graphique. Mais avant cela faut-il encore réussir est extraire ces données et à la mettre en forme pour qu'elles puissent ensuite être interpréter par une solution genre Jpgraph, google chart ou encore Openflashchart (je n'en suis pas encore à choisir ça...)

Problème premier :
Extraire les données de la base dans une plage de temps donnée n'est pas vraiment un problème. Par contre, la quantité de données à traiter est telle que si la génération d'un graphique sur une journée ne pose pas de problème, générer ce même graphique pour une année demande un temps de traitement tellement conséquent que cette solution n'est tout simplement pas envisageable...

Solution à ce premier problème :
Je me suis alors dit que je devais limiter le nombre de valeurs à traiter par la suite. Je me suis donné comme base 288 valeurs quelque soit la base de temps (288 est le nombre de mesures pour une journée). J'ai donc écrit un bout de code (je suppose que c'est le bon moment pour préciser que je suis débutant) pour voir ce que ça donnerais en temps de traitement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
//Essai génération date
$start_time = strtotime('11-09-2007 0:00:00');
$end_time = strtotime('12-09-2007 00:00:00');
 
$start_mysql_time = $start_time;
$end_mysql_time = $start_mysql_time + 300;
 
while ($end_mysql_time <= $end_time)
{
$select_time_start = date('Y', $start_mysql_time).'-'.date('m', $start_mysql_time).'-'.date('d', $start_mysql_time).' '.date('H', $start_mysql_time).':'.date('i', $start_mysql_time);
$select_time_stop = date('Y', $end_mysql_time).'-'.date('m', $end_mysql_time).'-'.date('d', $end_mysql_time).' '.date('H', $end_mysql_time).':'.date('i', $end_mysql_time);
 
$reponse = $bdd->query('SELECT AVG(Id_capteur1) FROM ' . $tableLogTemp . ' WHERE DATETIME BETWEEN \'' . $select_time_start . '\' AND \'' . $select_time_stop . '\'');
 
while ($donnees = $reponse->fetch())
{
print_r($donnees);
}
 
$reponse->closeCursor();
$start_mysql_time = $end_mysql_time;
$end_mysql_time = $start_mysql_time + 300;
}
Mon problème actuel :
Vous l'aurez compris, mon bout de code à juste pour but de tester la faisabilité de la chose et il se trouve que ... Ba ce n'étais pas une bonne idée. Chaque requête vers la DB prend plus ou moins 1 seconde. Multipliée par 280... soit un résultat garantie de :

Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\V0_4\select_datetime.php on line 35
Conclusion :
Si je pense que mon approche du problème est la bonne, il est claire que ma solution ne l'est pas. Quelqu'un aurait t'il une idée pour que je puisse parvenir à mes fins ?

Merci d'avance ne serais ce que pour le temps pris pour lire tout ça ^^