Indices MariaDB - IDX_HISTORY und DEVICE

Begonnen von AndyM, 15 März 2024, 13:27:03

Vorheriges Thema - Nächstes Thema

AndyM

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

Später habe ich nach folgender Anleitung ein Sicherungskonzept aufgebaut.
Inhalte einer primären Datenbank in eine andere Standby-Datenbank übertragen (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

DS_Starter

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.
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter