Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#1

Tabellen für viele kleine Datensätze optimieren

  Alt 9. Jul 2014, 15:13
Datenbank: MySQL • Version: 5.x • Zugriff über: UniDAC
Hallo,

ich bin gerade dabei, mir Vorüberlegungen zu einem Energie-Monitoring System zu machen. Bei unserem Kunden sollen diverse Strom/Gas/Wasser-Messgeräte verbaut werden, die via Modbus an Gateways übers Ethernet an unseren Server gehen. Die Messwerte sollen auch über Jahre gespeichet werden, um langfristige Betriebsoptimierungen darauf stützen zu können. Überschlagen fallen dabei etwa 150000 Messwerte pro Tag an, verteilt auf knapp 650 Messstellen.

Diese Werte sollen später sowohl als Liste gedruckt, aber auch grafisch betrachtet werden. Der Art "male mir bitte auf, wie sich die Spannung an Messstellen a, b und c zwischen dem 15.01.2014 und dem 15.02.2014 verhielt".

Meine Frage ist jetzt, wie ich mein Archiv am besten anlege. Bisher war ich von einer einzigen großen Tabelle ausgegangen, mit folgender Struktur:
SQL-Code:
CREATE TABLE `history` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `vdate` timestamp NOT NULL default '0000-00-00 00:00:00',
  `valueID` smallint(5) unsigned NOT NULL default '0',
  `maxValue` float NOT NULL default '0',
  `meanValue` float NOT NULL default '0',
  PRIMARY KEY (`id`),
  KEY `Index_2` (`valueID`),
  KEY `Index_3` (`vdate`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 6144 kB; InnoDB free: 53248 kB; InnoDB free: 92'
(Es werden häufiger als gespeichert Werte abgerufen, und dann nur minütlich bis stündlich Maxima und Durchschnitte in die Tabelle geschrieben. Sonst wäre das beim tatsächlichen Leseintervall ein Datenaufkommen von grob gerechneten 4,5GB/Tag, was etwas üppig würde.)

"valueID" ist ein Fremdschlüssel auf eine Liste der rund 650 Messstellen mit ihren Klartextnamen und anderen Infos.

Ich hatte jetzt die Idee, dieses eine Monster-Archiv in mehrere Tabellen zu splitten. Dabei wäre eine Aufteilung nach Messstellen interessant, da ich mir dann das Feld "valueID" sparen kann, was der Datenmenge ganz gut tut. Da sicherlich aber auch hier und da Betrachtungen von Werten mehrerer Messstellen in einer Liste bzw. in einem Diagramm gefragt sind, würden dann ggf. größere UNION-Konstrukte nötig. Und es entstünden halt auch 650 Tabellen.
Alternativ wäre auch eine Teilung nach Datum denkbar, so dass man vielleicht pro Monat ein neues Archiv beginnt, das dann aber alle Messstellen beinhaltet. Dann gibt es die UNIONs bei Monatsgrenzüberschreitenden Auswertungen.

Da ich mit derart üppigen Satz-Mengen nicht die größte Erfahrung habe, würde ich gerne euch fragen, ob sich abschätzen lässt, welche Strategie die bessere wäre. Da nur maximal pro Minute neue Eintragungen sind (dann aber potenziell für alle 650 Messstellen am Stück), ist denke ich vor allem die Performance bei der Auswertung der Knackpunkt. Ich will die Leute nicht dazu verdammen, eine Grafik die Mittags gebraucht wird, vor der Frühstückspause abzufragen.

Ein paar Erfahrungswerte würden mir hier viel helfen. Vielen Dank schon mal!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat