In navolging van een eerder topic met een andere vraag (MySQL totaal berekenen over tijdspanne van 1 uur), ben ik nu tegen een nieuw probleem aangelopen.
Voor een systeem waar ik mee aan het stoeien ben, heb ik een database opgezet waarin gelogd wordt hoeveel energie er opgewekt is door de zonnepanelen. Elke 5 min loggen de systemen naar een tabel en schrijven daar hun (tot op dat moment van de dag) hoeveelheid opgewekte energie op en hun totale (lifetime) opgewekte energie.
Nu wil ik berekenen hoeveel energie alle systemen bij elkaar opgewekt hebben. Dit wil ik doen door voor elk systeem de maximale gelogde energiewaarde te nemen en dat allemaal bij elkaar op te tellen.
De tabel ziet er als volgt uit: (vereenvoudigd voorbeeld, echte bevat 40 kolommen en 250.000 records so far)
Hiervoor gebruik ik de volgende query:
Het probleem is echter dat deze query er tussen de 8 en 10 seconden over doet om een resultaat terug te geven. Zodra de query in de cache zit gaat het uiteraard beter, maar elke 5 minuten wordt deze weer geleegd dus dat biedt geen soelaas.
Is er een betere manier om dit totaal te berekenen? Of heeft iemand anders tips qua performance?
Voor een systeem waar ik mee aan het stoeien ben, heb ik een database opgezet waarin gelogd wordt hoeveel energie er opgewekt is door de zonnepanelen. Elke 5 min loggen de systemen naar een tabel en schrijven daar hun (tot op dat moment van de dag) hoeveelheid opgewekte energie op en hun totale (lifetime) opgewekte energie.
Nu wil ik berekenen hoeveel energie alle systemen bij elkaar opgewekt hebben. Dit wil ik doen door voor elk systeem de maximale gelogde energiewaarde te nemen en dat allemaal bij elkaar op te tellen.
De tabel ziet er als volgt uit: (vereenvoudigd voorbeeld, echte bevat 40 kolommen en 250.000 records so far)
code:
1
| id | id_system | time (datetime) | energy | energy_total |
Hiervoor gebruik ik de volgende query:
MySQL:
1
2
3
4
5
6
| SELECT SUM(energy_total) as energy_total FROM ( SELECT MAX(energy_total) as energy_total FROM data_running GROUP BY id_system ) as subtable |
Het probleem is echter dat deze query er tussen de 8 en 10 seconden over doet om een resultaat terug te geven. Zodra de query in de cache zit gaat het uiteraard beter, maar elke 5 minuten wordt deze weer geleegd dus dat biedt geen soelaas.
Is er een betere manier om dit totaal te berekenen? Of heeft iemand anders tips qua performance?