Wenn du schon Indize verwendest, dann eventuell so, daß sie sich schneller nutzen lassen?
Du greifst ja bestimmt entweder nur über die ValueID auf (alle) Werte eines Sensors zu, oder auf alle Sensorwerte in einem bestimmten Zeitraum und dementsprechen sollten dann doch die Indize gewählt werden.
Das ID-Feld in der Wertetabelle ist jedenfalls nutzlose Platzverschwendung.
SQL-Code:
CREATE TABLE Zeittabelle (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`time` TIMESTAMP NOT NULL UNIQUE
)
CREATE TABLE Quelltabelle (
`id` SMALLINT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL UNIQUE,
...
)
CREATE TABLE WertTabelle (
`valueID` SMALLINT NOT NULL REFERENCES Quelltabelle, -- vielleicht doch INT, das wären dann schöne 4*4 = 16 Byte pro Datensatz plus den Index
`timeID` INT NOT NULL REFERENCES Zeittabelle,
`maxValue` FLOAT NOT NULL, --DEFAULT 0,
`meanValue` FLOAT NOT NULL, --DEFAULT 0,
PRIMARY KEY (`valueID`, `timeID`),
KEY Index_2 (`timeID`)
)
Um die Größe der WertTabelle aufzuteilen:
http://dev.mysql.com/doc/refman/5.7/...titioning.html
Und noch etwas zu den Engines:
http://dev.mysql.com/doc/refman/5.1/...e-engines.html
Man könnte auch Werte zusammenfassen, was zwar Speicherplatz sparen würde, aber beim Auslesen und Auswerten gibt das erhöhten aufwand, da man dann die Spalten wieder auf mehrere Zeilen auftrennen/drehen müsste.
Also ich glaub nicht, daß es den Aufwand wert wäre.
z.B. die Werte für je 10 Sensoren pro Datensatz.
0 = valueID=0 bis valueID=9
1 = valueID=10 bis valueID=19
...
SQL-Code:
CREATE TABLE WertTabelle (
`valueIndex` SMALLINT NOT NULL REFERENCES Quelltabelle,
`timeID` INT NOT NULL REFERENCES Zeittabelle,
`maxValue0` FLOAT NOT NULL DEFAULT 0,
`meanValue0` FLOAT NOT NULL DEFAULT 0,
`maxValue1` FLOAT NOT NULL DEFAULT 0,
`meanValue1` FLOAT NOT NULL DEFAULT 0,
...
`maxValue9` FLOAT NOT NULL DEFAULT 0,
`meanValue9` FLOAT NOT NULL DEFAULT 0,
PRIMARY KEY (`valueIndex`, `timeID`),
KEY Index_2 (`timeID`)
)