FHEM Forum

FHEM => Automatisierung => Thema gestartet von: joshi04 am 07 September 2014, 11:50:13

Titel: Performance-Steigerung mit kombiniertem Index für DbLog
Beitrag von: joshi04 am 07 September 2014, 11:50:13
Hallo FHEMler,

ich war immer noch nicht wirklich zufrieden mit der Performance, Plots anzuzeigen, konnte neulich aber einen SQL-Fachman dazu befragen.
Das folgende ist also nicht auf meinem Mist gewachsen, aber vielleicht hilft es auch anderen:

Die SQL-Abfrage wird grundsätzlich beschleunigt, wenn man Indices verwendet, soweit war ich vorher auch schon. Noch etwas schneller wird es, wenn man einen Index verwendet, der auf die SQL-Abfrage angepasst ist.

Anstatt daher einen Index auf die einzelnen Spalten zu setzten, habe ich derzeit nur noch einen Index, der DEVICE, READING und TIMESTAMP kombiniert. Die Beschleunigung der Abfrage war dabei durchschnittlich etwas über Faktor 2 gemessen mit apptime gegenüber den Indizes pro Spalte.

Erzeugen lässt sich der Index über (mysql):

CREATE INDEX Index_COMBINED ON history (DEVICE,READING,TIMESTAMP );


Leider reichen meine Perl-Kenntnisse noch nicht aus, um genau zu schauen, wie die Abfrage im SVG-Modul genau sind. Es kommt dabei ebenfalls auf die Reihenfolge an. So erschien es mir aber als am sinnvollsten und die Ergebnisse waren nach kurzer Testphase damit am besten. Vielleicht ist hier noch ein Quäntchen Marge drin, wenn man die Abfrage auf die Datenbank genau kennt.

Interessanter Weise bin ich hier im Forum recht selten über die Information gestolpert, einen Index einzurichten, geschweige denn, den richtigen, oder wie man das macht. Vielleicht aber auch Allgemeinwissen, bei mir zumindest nicht. Wenn die Performance Steigerung jemand anders bestätigen kann, wäre es imho sinnvoll, die Information ins Wiki/CommandRef mit aufzunehmen. Oder habe ich das etwa übersehen?

Nur der Vollständigkeit halber was die Performance im Allgemeinen angeht, es gilt natürlich zu jedem Zeitpunkt nur so wenig wie möglich und soviel wie nötig zu loggen.  Maßnahmen über DbLogExclude, event-Attribute fand ich hier gut zusammengefasst:

https://blog.chanoa.de/fhem-performance
(https://blog.chanoa.de/fhem-performance)
Titel: Antw:Performance-Steigerung mit kombiniertem Index für DbLog
Beitrag von: betateilchen am 08 September 2014, 09:42:33
Zitat von: joshi04 am 07 September 2014, 11:50:13
Nur der Vollständigkeit halber

nur der Vollständigkeit halber: Wenn man sich die von FHEM mitgelieferten (!) Beispielskripte zum Anlegen der Datenbank für DbLog einfach einmal anschaut, wird man dort seit Ewigkeiten genau diese Information finden, die Du hier gerade verbreitest. Dort steht nämlich folgendes:

Zitat
CREATE DATABASE `fhem` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'fhemuser'@'%' IDENTIFIED BY 'fhempassword';
CREATE TABLE `fhem`.`history` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
CREATE TABLE `fhem`.`current` (TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32));
GRANT SELECT, INSERT, DELETE, UPDATE ON `fhem`.* TO 'fhemuser'@'%';
CREATE INDEX Search_Idx ON `fhem`.`history` (DEVICE, READING, TIMESTAMP);

Quelle: ./contrib/dblog/db_create_mysql.sql