Hallo,
meine MariaDB habe ich damals nach folgender Anleitung, mit den Indices
IDX_HISTORY und
DEVICE, erstellt.
FHEM Tutorial-Reihe - Part 7.3: mySQL-Server (MariaDB) für Logging nutzen (https://haus-automatisierung.com/hardware/fhem/2018/03/12/fhem-tutorial-reihe-part-7-3-mysql-mariadb-server-fuer-logging-nutzen.html)
Später habe ich nach folgender Anleitung ein Sicherungskonzept aufgebaut.
Inhalte einer primären Datenbank in eine andere Standby-Datenbank übertragen (syncStandby) (https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Inhalte_einer_prim%C3%A4ren_Datenbank_in_eine_andere_Standby-Datenbank_%C3%BCbertragen_(syncStandby))
Die Standby-Datenbank habe ich wie die Primär-Datenbank mit den Indices
IDX_HISTORY und
DEVICE, erstellt.
Den zusätzlich zur normalen Erstellung der history-Tabelle nötigen Primary-Key -
PRIMARY KEY(TIMESTAMP, DEVICE, READING) - habe ich mittlerweile auch in meiner Primär-Datenbank. Da sonst die Summe der Events in beiden DBs nicht übereinstimmt.
Bei einem
configCheck meiner Primär-Datenbank im
DbLog wurde ich darauf hingewiesen den
Search_Idx und den
Report_Idx anzulegen.
Aktuell habe ich also folgende Indices.
- PRIMARY KEY (`TIMESTAMP`, `DEVICE`, `READING`) USING BTREE,
- INDEX `IDX_HISTORY` (`DEVICE`, `READING`, `TIMESTAMP`, `VALUE`) USING BTREE,
- INDEX `DEVICE` (`DEVICE`, `READING`) USING BTREE,
- INDEX `Search_Idx` (`DEVICE`, `READING`, `TIMESTAMP`) USING BTREE
- INDEX `Report_Idx` (`TIMESTAMP`, `READING`) USING BTREE
Sind die Indices
IDX_HISTORY und
DEVICE denn sinnvoll?
Wenn ich den PRIMARY KEY umstelle, würde er den
Search_Idx dann Ersätzen?
Ich frage so explizit nach, weil mir bei der Analyse eines Select für einen Plot mit EXPLAIN angezeigt wird, dass der Index
IDX_HISTORY verwendet wird, dieser aber nicht von FHEM Vorgeschlagen wird.
EXPLAIN SELECT DATE_FORMAT(TIMESTAMP, '%Y-%m-%d %H:%i:%s'), DEVICE, READING, VALUE FROM history WHERE 1=1 AND `DEVICE` = 'ESPEasy_Garage_Temp' AND `READING` = 'Pressure' AND `TIMESTAMP` >= STR_TO_DATE('2023-12-09 00:00:00', '%Y-%m-%d %H:%i:%s') AND `TIMESTAMP` <= STR_TO_DATE('2023-12-10 00:00:00', '%Y-%m-%d %H:%i:%s') ORDER BY `TIMESTAMP`
Vielen dank im Voraus
Der Index `Search_Idx` ist obsolet wenn der PRIMARY KEY angelegt ist. Darauf wird auch im configCheck hingewiesen. Die Index `IDX_HISTORY` und `DEVICE` würde ich auch als unnötig erachten.
Der Index `IDX_HISTORY`wird wahrscheinlich jede Menge Speicher verbrauchen weil er den VALUE beinhaltet.
Einen Vorteil würde er m.M. nur bringen wenn die SQL auch den VALUE in der where Klausel abfragen würde.