Titlul e cam lung, nu cred ca ati inteles ce vreau, incerc sa explic in urmatoarele randuri.
Am o baza de date unde salvez valoare mai multor senzori, majoritatea senzorilor trimit date noi odata la 5 minute, am altii care trimit odata la 2 minute, la 1 minut, si senzorul de energie (Wati) l-am setat sa trimita la fiecare 10 secunde.
Acum am facut o pagina noua in care am o lista cu toti senzorii activi in ultimele 24 de ore, dar din cauza ca unii din senzori au salvat foarte multe randuri (mult mai des decat alti senzori), astept destul de mult pana se afiseaza pagina in browser. As vrea ca toate graficele sa contina informatii din ultimele 24 de ore, dar as vrea ca fiecare grafic sa fie format din maxim 100 de puncte
Am mai avut problema asta si inainte cand am inceput lucrul la dashboard, cand am utilizat AND id MOD $every_n_th_row = 0
, dar aceasta varianta este foarte foarte inceata, query-ul se executa mult mai rapid daca efectiv afisez sute de rows-uri, in loc sa le limitez folosind id MOD $every_n_th_row = 0
in query.
Mai jos va pun functia care am facuto si pe care o folosesc acum, merge mult mai rapid decat id MOD $every_n_th_row = 0, dar acum in pagina in care am lista cu toti senzorii, se intarzie cam mult, si as vrea sa gasesc o varianta si mai rapida.
Mai demult ma gandeam sa imi fac si alte tabele “arhiva pe termen lung”, odata pe zi sa rulez un script care copiaza informatiile de la toti senzorii, inregistrate in ziua anterioara, dar la un interval mai rar, tabelul cu arhiva zilnica sa contina informatii la fiecare 15 minute, tabelul cu arhiva lunara sa contina datele trimise odata la 30 minute, iar tabelul cu arhiva anuala odata la 1 ora … - asta era una dintre ideile mele pt a face extragerea datelor mai rapida, pt afisarea unor grafice - nu foarte detaliate.
Acum va rog pe voi sa imi spuneti cum ati face voi extragerea datelor din baza de date, tinand cont ca unii senzori salveaza 21600 randuri / zi, altii 1440 randuri / zi si altii 288 randuri / zi . iar toate graficele ar trebui sa contina informatii din ultimele 24 ore, dar avand maxim 100 - 200 randuri fiecare ?
Asta e una dintre functiile pe care o folosesc pt extragerea datelor, functia asta calculeaza automat $every_n_th_record, variabila pe care o trimit cand apelez functia nu se mai foloseste, dar am alta functie care tine cont de acea variabila. Oricum ar fi … ambele au cate o problema, sunt oarecum incete, cand queryul returneaza foarte multe randuri
function get_last_24hours_readings($sensor_id,$sensor_value,$readings=10,$every_n_th_record=1, $hours=1)
{
global $db;
$hours_to_time = $hours * 3600;
$x_hours_ago = time() - $hours_to_time;
$n =0; // ".(($every_n_th_record!=1) ? 'AND id mod '.$every_n_th_record.' = 0' : '')."
$q_sensor = mysqli_query($db, "SELECT `value_integer` FROM `home_devices_status` WHERE `value_name` = '".$sensor_value."' AND device_id = '".$sensor_id."' AND added_date > ".$x_hours_ago." ORDER BY `id` DESC");
$values = '';
$r=0;
$total_rows = mysqli_num_rows($q_sensor);
if($total_rows > $readings)
{
$dinamic_every_nth_row = round($total_rows / $readings);
}
else
{
$dinamic_every_nth_row = 1;
}
if($total_rows != 0)
{
while($sensor = mysqli_fetch_assoc($q_sensor))
{
if($n==$dinamic_every_nth_row)
{
$values = $sensor['value_integer']. (($r==0)?'':','). $values;
$n=0;
$r++;
}
$n++;
}
}
return $values;
}
In JSfiddle de jos am pus codul HTML dar si timpul necesar pt generarea fiecarei sectiuni de cod (in comment html), o sa vedeti ca numarul valorilor din fiecare grafic este similar, dar timpul pt generarea HTML-ului difera foarte mult, la unii senzori a durat 0.05secunde, la altii 6 secunde
https://jsfiddle.net/j2n24g7c/1/
Multumesc. Va doresc o duminica frumoasa tuturor