Hallo Zusammen,
ich habe bei mir eine FHEM Installation mit Homematic, einigen 1-Wire Sensoren und ich lese einige Werte aus meinem Viessmann Brenner aus.
Seit ca. einem Jahr schreibe ich die Daten in eine MySql Datenbank, so dass inzwischen einiges an Daten aufgelaufen ist.
Bisher war das mit den Grafiken aus der Datenbank und pgm2 nicht so einfach, aber das hat sich kürzlich geändert. Klasse!
Nun sind in meiner history Tabelle inzwischen ca. 3Mio. Einträge und der "SELECT" hat dann bei meinem Setup doch ca 60Sekunden gebraucht.
Dass wollte ich etwas schneller hin bekommen und habe eine Lösung gefunden.
Mit wem sollte ich die Änderungen besprechen, damit sie, wenn sie auch zu dem Gesamtpaket passen, in die Codebasis übernommen werden können.
Beste Grüße,
Friedrich
mit mir...
Für PostgreSQL habe ich "intelligente" Indices erstellt, bzw die Abfrage und Indices aufeinander abgestimmt.
IMHO sollten diese Indices auch auf MySQL übertragbar sein. Dann ist ein Tagesplot in 5-6sek erstellt. Eine Codeänderung ist IMHO nicht nötig, sollte nicht nötig sein.
Die Index DDL brauche ich dann um sie im Contrib im CREATE Script einzuchecken.
Hallo Tobias,
prima, dann habe ich wahrscheinlich die gleiche Lösung wie Du.
Das Select in der Methode DbLog_Get sieht jetzt bei mir wie folgt aus:
my $stm= "SELECT
$sqlspec{get_timestamp},
DEVICE,
READING,
VALUE
$sqlspec{all}
FROM history
WHERE 1=1
AND DEVICE = '".$readings[$i]->
AND READING = '".$readings[$i]->[1]."'
AND TIMESTAMP > $sqlspec{from_timestamp}
AND TIMESTAMP < $sqlspec{to_timestamp}
ORDER BY TIMESTAMP";
und den Index habe ich definiert mit
create index Device_Idx on history (DEVICE, READING, TIMESTAMP);
Das müsste dann in das Script zum Anlegen der Datenbank.
Getestet habe ich es mit MySql. Ich habe in den Syntax-Beschreibungen von Postgresql, Oracle und Sqlite nach gesehen und ich denke es sollte dort auch funktionieren.
Beste Grüße,
Friedrich
versuch bitte als erstes den unmodifizierten Code des DbLog Moduls zu benutzen und danach den Index daraufhin anzupassen.
DEVICE und READING wird auf einen String concatiniert. Hat den HIntergrund, mehr als ein Device/Reading mit derselben Abfrage zu erhalten.
Hallo Tobias,
Du hast wahrscheinlich einen sog. "function based index", wie sie in Oracle und wahrscheinlich auch in Postgresql existieren, verwendet. MySql kennt dieses Feature leider nicht. Insofern kommen wir wahrscheinlich nicht um eine Codeänderung herum, um die Abfragen auch im MySql zu beschleunigen.
Wenn das concat der Spalten für ein Feature von Dir wichtig ist, könnten wir die Funktionalität der "function based indices" mit einer extra Spalte nachbilden, die die Daten in zusammengesetzter From enthält. Über diese Spalte läuft dann der Index. Dafür müssten wir dann die INSERTS anpassen oder die einen entsprechenden Trigger in die Datenbank einfügen. Was mir an der Lösung nicht so recht gefällt ist die Duplizierung der Daten(menge).
Wie Siehst Du das?
Beste Grüße,
Friedrich
doppelt abzulegen ist nicht so toll :(
Ev. muss die Abfrage um Device und Reading erweitert werden... ich muss mal drüber nachdenken...
Änderung im Modul ist eingecheckt, Index im contrib/dblog hinzugefügt